9

バックグラウンドで実行され、リモートサーバーと通信し、必要に応じてユーザーに通知を表示するサービスを備えたAndroidアプリケーションがあります。このアプリには、ユーザーが操作するためのアクティビティもあります。

要件の1つは、アプリケーションが午前中に自動的に起動する必要があることです。1日の終わりに、ユーザーはアプリを自由に終了できます(終了機能はサービスを停止し、ウェイクロックを解放し、Androidにプロセスを強制終了させます)。アプリケーションを自動的に再起動するために、AlarmManagerとPendingIntentを使用してアラームをスケジュールしています。

    //create intent to alert OnStartReceiver when alarm goes off
    Intent i = new Intent(context, OnStartReceiver.class);
    i.setAction("com.pointtrace.intents.alarm");
    i.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION|Intent.FLAG_FROM_BACKGROUND);


    //wrap inside PendingIntent so that it can be used from outside
    //our application
    PendingIntent pi = PendingIntent.getBroadcast(context, 1, i, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

    Log.d("GXT", "Scheduling alarm action(i)=" + i.getAction());

    //set alarm to go off at wake time
    alarms.set(AlarmManager.RTC_WAKEUP, getWakeTime(), pi);

OnStartReceiverクラスはブロードキャストを受信するように登録されており、アラームが発生するとアプリを再起動します。

ユーザーがタスクマネージャーからアプリケーションを強制終了しない限り、すべてが正常に機能します。Android OSによって強制終了されるか、System.exit(0)を呼び出すことによって、アプリケーションが正常に終了した場合。正常に再起動します。しかし、タスクマネージャから強制終了されると、アラームがキャンセルされているように見えます。

Androidのドキュメントには、タスクマネージャーによってアラームがキャンセルされることを示唆するものは何も見つかりませんでした。アラームを正しく設定する方法に関して何か間違ったことをしていますか?

フラグを削除して0を使用してみましたが、違いはありませんでした。

ありがとう。

4

2 に答える 2

8

終了機能は、サービスを停止し、wake lock を解放し、Android がプロセスを強制終了できるようにします

継続的なWakeLock.

また、Android はいつでもプロセスを強制終了できます。startForeground()Android がプロセスを強制終了しないというある種の保証と誤解しないでください。

しかし、タスクマネージャーから強制終了されると、アラームがキャンセルされたように見えます。

Androidには何もないので、「タスクマネージャー」が何であるかわかりません。設定で実行中のアプリのリストを意味し、[強制停止] をクリックすると、はい、未解決のアラームがキャンセルされ、何かが手動でコンポーネントの 1 つを起動するまで (ユーザーがランチャーからアプリを起動するなど)、アプリが再び実行されなくなります。 )。

アラームを適切に設定する方法に関して、私は何か間違っていますか?

おそらくそうではありません。強制停止は間違いなくあなたのアラームを一掃します。

于 2012-07-25T20:57:42.790 に答える