我有一个相当标准的服务,我想通过报警来触发。 下面是服务的开始部分:
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
没有改善。
我宁愿这个困惑 - 任何人都可以解释这种行为,并建议如何得到它像预期的那样?
编辑 - 那所得溶液中的行为的收集是我的回答如下。