我正在IntentService中做一些后台工作,并尝试通过单击通知来停止它。为了停止工作,我有一个静态方法,它设置一个标志。
public static void stopService() {
if (task != null) {
task.setCancelFlag(true);
}
}
通知有PendingIntent
,它会向接收方发送广播,尝试停止服务。
Intent intent = new Intent(this, AlarmReceiver.class);
intent.setAction(AlarmReceiver.STOP_SERVICE);
PendingIntent contentIntent = PendingIntent.getBroadcast(getBaseContext(), 0,
intent, 0);
notification.contentIntent = contentIntent;
接收方在接收广播时调用stopService()
方法。
if (intent.getAction().equals(STOP_SERVICE)) {
UpdateCheckService.stopService();
}
奇怪的是,stopService()
方法没有被正确调用。如果我尝试记录它,则不执行带有标志设置的部分。即使我在Receiver上设置断点并尝试对其进行调试,它也不起作用。
但是,如果我通过单击按钮从Activity
调用相同的方法,则一切都按预期工作。
有人知道,这种奇怪的行为来自哪里?
答案 0 :(得分:0)
您不应该为您的案例使用IntentService类。 IntentService使用队列一次处理一个Intent。只需创建自己的类,将Service扩展为示例here。 然后像处理停止工作线程一样处理停止请求。
答案 1 :(得分:0)
这个谜团已经解决了:我的BroadcastReceiver设置了远程进程标志,我从Web上的一些教程中复制了这些标志而没有太多思考。删除此标记使一切都按预期工作。
答案 2 :(得分:0)
(我知道这是一个老问题,但我找不到合适的解决方案,所以我在这里写下我的解决方案,我希望将来可以帮助某人)
我使用IntentService的意图来创建PendingIntent
在 onHandleIntent 上,我致电我的通知:
@Override
protected void onHandleIntent(Intent intent) {
PendingIntent pStopSelf = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
然后我添加了停止按钮并调用我的通知(在NotificationCompat.Builder上插入此行):
.addAction(R.drawable.ic_close_white_24dp, "Stop", pStopSelf)
一旦我配置了onHandleIntent,我调整了onStartCommand以检查是否标记为取消:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.getFlags() == PendingIntent.FLAG_CANCEL_CURRENT) {
Log.d(TAG, "Stop pressed");
BackupMedia.stopBackup(); //Clear the data and handle everything you need when the STOP is pressed
stopSelf();
return 0;
}
return super.onStartCommand(intent, flags, startId);
}
它对我来说很好