我有一个相当标准的服务,我希望使用警报来触发它。这是服务的启动部分:
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
没有任何改进。
我对此感到困惑 - 任何人都可以解释这种行为并提出让它按预期运行的方法吗?
编辑 - 导致解决方案的操作集合在我下面的答案中。