Android 通过单击通知停止IntentService

Android 通过单击通知停止IntentService,android,Android,我正在IntentService中做一些后台工作,并试图通过单击通知使其停止。为了停止工作,我有一个静态方法,它设置了一个标志 public static void stopService() { if (task != null) { task.setCancelFlag(true); } } 通知有一个挂起内容,它向试图停止服务的接收器发送广播 Intent intent = new Intent(this, AlarmReceiver.class); in

我正在IntentService中做一些后台工作,并试图通过单击通知使其停止。为了停止工作,我有一个静态方法,它设置了一个标志

public static void stopService() {
    if (task != null) {
        task.setCancelFlag(true);
    }
}
通知有一个
挂起内容
,它向试图停止服务的接收器发送广播

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()
方法。如果我尝试记录它,则不执行带有标志设置的部分。即使我在接收器上设置了一个断点并尝试调试它,它也不起作用

但是,如果我通过单击按钮从
活动调用相同的方法,则一切都会按预期进行


有人知道这种奇怪的行为是从哪里来的吗?

您不应该在您的案例中使用IntentService类。IntentService使用队列一次处理一个意图。以创建自己的扩展服务的类为例。
然后像停止工作线程一样处理停止请求。

谜团已经解开:我的BroadcastReceiver设置了远程进程标志,这是我从web上的一些教程中复制的,我没有过多考虑。删除此标记使一切都按预期进行。

我这样做是为了使用IntentService创建PendingEvent

onHandleIntent中,我调用通知:

@Override
protected void onHandleIntent(Intent intent) {
    PendingIntent pStopSelf = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
然后我添加了停止按钮并调用我的通知(在NotificationCompat.Builder上插入这一行):

单击通知上的停止按钮将不会触发onHandleIntent,而是调用
onStartCommand
。在这里,您可以检查意图是否包含我们设置为停止服务的标志

private boolean shouldStop = false;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent.getFlags() == PendingIntent.FLAG_CANCEL_CURRENT) {
        Log.d(TAG, "Stop pressed");
        stopSelf();
        shouldStop = true;
        return Service.START_NOT_STICKY;
    }
    return super.onStartCommand(intent, flags, startId);
}
stopSelf()
停止包含在意图服务中执行更多工作的工作请求的意图,以重新启动服务。但它不会停止服务本身

要停止服务继续执行,请使用前面设置的布尔值,在
onHandleIntent()中检查工作是否应像这样继续


使用布尔值在代码之间签入,以检查服务是否应该停止并从方法返回

是的,它是对AsyncTask的静态引用。听起来不对。您似乎正在从IntentService启动异步任务,然后希望该任务停止?IntentService为OnHandleContent启动一个新线程,因此通过启动异步任务,您将失去使用IntentService.UpdateCheckService.stopService(false,上下文)的全部好处;不调用.stopService(),我更新了截取的代码。真正的代码签名有点不同,但这不是重点。关于AsyncTask:我知道这听起来很奇怪,但出于代码冗余的原因,我只调用AsyncTask的'doInBackground'方法,因此没有创建额外的线程。“真正的”异步部分在代码中的其他地方使用。当您调试它时,它是task==null?我知道,这是一种可能性,但我想继续使用IntentService。除此之外,正如我所描述的,这种行为非常奇怪,不是吗?
private boolean shouldStop = false;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent.getFlags() == PendingIntent.FLAG_CANCEL_CURRENT) {
        Log.d(TAG, "Stop pressed");
        stopSelf();
        shouldStop = true;
        return Service.START_NOT_STICKY;
    }
    return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(Intent intent) {
    //Invoke notification

    doStuff();
}

private void doStuff() {
    // do something 

    // check the condition
    if (shouldContinue == false) {
        return;
    }
}