单击“通知”停止IntentService

时间:2011-09-22 17:50:13

标签: android

我正在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调用相同的方法,则一切都按预期工作。

有人知道,这种奇怪的行为来自哪里?

3 个答案:

答案 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);
}

它对我来说很好