4

バックエンドで電話センサー (WiFi、加速度計など) を定期的に読み取るタスクがあります。

私の現在の解決策は、AlarmManager を使用することです。

具体的には、次のとおりです。

「メイン」プログラム (アクティビティ) では、PendingIntent.getService を使用します。

public class Main extends Activity {
...
インテント インテント = 新しいインテント(これ、AutoLogging.class);
mAlarmSender = PendingIntent.getService(これ、0、意図、0);
am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC, 0, 5*1000, mAlarmSender);
}

「AutoLogging」プログラム (サービス) では、定期的にアラームに応答します。

public class AutoLogging extends Service {
...
@オーバーライド
public void onCreate() {
   Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
}

@オーバーライド
public void onDestroy() {
   super.onDestroy();
   Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
}

@オーバーライド
public boolean onUnbind(インテント インテント) {
   Toast.makeText(this, "onUnbind", Toast.LENGTH_SHORT).show()
   super.onUnbind(インテント) を返します。
}

@オーバーライド
public void onStart(インテント インテント, int startId) {
   super.onStart(インテント、startId);
   Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show();
   // ここでセンサーデータを読み込みます
}

@オーバーライド
   public IBinder onBind(インテント インテント) {
   Toast.makeText(this, "onBind", Toast.LENGTH_SHORT).show();
   null を返します。
}
}

私の問題は次のとおりです。

このアラーム サービスを使用すると、各アラームで OnCreate と OnStart のみが呼び出されます。

私の質問は次のとおりです。

(1) OnDestroy (または onBind、onUnbind) を呼び出す必要がありますか?

(2) これは AlarmManager を使用する正しい方法ですか (「ブロードケース レシーバー」と比較して)?

ありがとう!ヴィンセント

4

3 に答える 3

0

AlarmManager は保留中のインテントを使用してインテント アクションを実行します。つまり、あなたのケースではサービスを開始します。アラームの有効期限が切れると、onCreate(まだ実行されていない場合) を使用してサービスが作成され、onStart を呼び出して開始されます。センサー データの読み取りが完了したら、最終的に onDestroy() を呼び出す stopSelf() を使用してサービスを停止できます。サービスで明示的に onDestroy()、onBind() または onUnBind() を呼び出さないでください。

アラーム マネージャでブロードキャスト レシーバを使用する場合は、レシーバの onReceive でこのサービスを開始する必要があります。

于 2010-11-29T14:58:50.053 に答える