android alarmmanager管理,android – 由AlarmManager重新创建的服务

我有一个相当标准的服务,我希望使用警报触发.这是服务的启动部分:

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并将上下文替换为MyService.this而没有任何改进.

我对此感到很困惑 – 任何人都可以解释这种行为并建议如何让它按预期行事吗?

编辑 – 导致解决方案的行动集合在我的答案中.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值