0

私はAndroidプログラミングが初めてなので、これらはおそらくばかげた質問です。私はいくつかの読書をしましたが、答えを得ることができません。

サービスから登録されたいくつかの意図を持つブロードキャストレシーバーがあります-

    receiver = new EventHandler();
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); // for calls
    registerReceiver(receiver, filter);

サービスを実行し続けるために入れた "setForeground" 呼び出しを削除したため (ステータス バー アイコンが必要ないため、そのアプローチを怠っているのではないかと考えています)、サービスは次のようになります。定期的に停止し、通常は短時間で再起動します (ただし、5 分かかることもあります)。

質問 - インテントをプログラムで登録したので、プロセスがたまたま停止状態になった場合、興味のあるインテントを送信することを Android はどのように知るのでしょうか。いくつかのイベントを欠場すると思います。

インテントをマニフェストに入れてみましたが、バッテリーが変更されたインテントにはその手法を使用できないことを読みました (そして観察しました)。

ありがとう。

4

3 に答える 3

0

まず、サービスを存続させたい場合は、からを取得してからWakeLock解放する必要があります。PowerManageronCreate()onDestroy()

http://developer.android.com/reference/android/os/PowerManager.html

OSがサービスを破壊して再作成することもありますが、長期間停止することを心配する必要はありません。(たとえば、キーロックを適用した後も存続することstartForeground()を保証するものではありません。)Service

サービスが破壊された場合でも、OSは起動しIntentsますが、表示されません。

于 2012-07-27T08:12:48.590 に答える
0

サービスが強制終了されて再起動されることについては、特にメモリが少ない場合、Androidでは正常です。ACTION_BATTERY_CHANGEDはマニフェストに入れることはできませんが、ACTION_SCREEN_ON/OFFは入れることができます。したがって、サービスを配置し、イベントレシーバーが実行されていることを確認し、onCreate()メソッドにレジスタを配置します。

public void onCreate() {
    super.onCreate();

    // battery
    registerReceiver(mBatteryInfoReceiver, new IntentFilter(
        Intent.ACTION_BATTERY_CHANGED));
    ...
}

public void onDestroy() {
    super.onDestroy();

    unregisterReceiver(mBatteryInfoReceiver);
}

また、サービスを停止する場合は、登録を解除することを忘れないでください

于 2012-07-27T08:30:19.993 に答える
0

インテントは、Android の特別な遅延バインディング メカニズムです。ブロードキャスト レシーバー、アクティビティ、およびサービスは、システムにインテント フィルターを登録し、インテントが起動されると、システムはこのインテントを処理できるコンポーネントをアクティブにします。したがって、インテント フィルタがシステムに登録されている場合、コンポーネントが呼び出されます。システム内の静的なインテント フィルター (AndroidManifest.xml で宣言されているもの) の場合、Android OS はシステムの起動時に登録します。動的なインテント フィルター (ブロードキャスト レシーバーのコードで宣言されている) の場合、起動後にそれらを登録する必要があります。したがって、onBoot イベントのインテント フィルターを宣言でき、このブロードキャスト レシーバーで動的なインテントを宣言できます。

于 2012-07-27T08:15:34.750 に答える