アラームを使用してトリガーしたいかなり標準的なサービスがあります。サービスの開始セクションは次のとおりです。
class MyService extends Service {
private Context context;
private AlarmManager alarmManager = null;
private final String startReason = "com.stuff.myreason";
private final int REASON_NO_INTENT = 0;
private final int REASON_ALARM = 1;
private final int REASON_X = 2; // and so on.
@Override
void onCreate() {
super.onCreate();
context = getApplicationContext();
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
// do onCreate stuff
}
@Override
int onStartCommand (Intent intent, int flags, int startId) {
int reason = REASON_NO_INTENT;
if (intent != null) {
reason = intent.getExtra(startReason, REASON_NO_INTENT);
}
switch(reason) {
// handle the different reasons we may have been "started"
}
return START_STICKY;
}
}
アクティビティからcontext.startServiceを使用してトリガーすると、完全に正常に起動します。特に、すでに実行されている場合は、最初から(再)開始するのではなく、を介して既存のインスタンス化に入るだけonStartCommand()
です。これは予想される動作です。ただし、AlarmManagerを使用してトリガーすると、次のようになります。
Intent intent = new Intent(context, MyService.class);
intent.putExtra(purposeOfStartCode, REASON_ALARM);
PendingIntent pi = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP, /* A time in the future */, pi);
アラームの期限が来ると、サービスを最初から再開するように見えます。すでに実行中のインスタンス化を呼び出すだけonCreate()
でonStartCommand()
なく、新しいインスタンス化を開始して呼び出します。onStartCommand()
私はすでにPendingIntent
フラグをに変更して、改善なしFLAG_ONE_SHOT
で置き換えることを試みました。context
MyService.this
私はこれにかなり戸惑っています-誰かがこの動作を説明し、期待どおりに動作させる方法を提案できますか?
編集-解決策をもたらしたアクションのコレクションは、以下の私の答えにあります。