Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除服务时销毁前台通知_Java_Android - Fatal编程技术网

Java 删除服务时销毁前台通知

Java 删除服务时销毁前台通知,java,android,Java,Android,我有一个前台服务,可以从网上下载一些内容 不幸的是,由于一个错误,当接收器在我的服务中接收到广播时,报告我的服务被终止,但它的通知不会被终止,我在日志猫中看到以下日志: I/ActivityManager(449): Killing 11073:my-package-name/u0a102 (adj 0): remove task 当前台通知的父服务被操作系统终止时,是否仍有必要销毁前台通知?您可以从服务类内部的桌面或onDestroy中删除该通知。 注:不保证这会起作用,在api 14及以上

我有一个前台服务,可以从网上下载一些内容

不幸的是,由于一个错误,当接收器在我的服务中接收到广播时,报告我的服务被终止,但它的通知不会被终止,我在日志猫中看到以下日志:

I/ActivityManager(449): Killing 11073:my-package-name/u0a102 (adj 0): remove task

当前台通知的父服务被操作系统终止时,是否仍有必要销毁前台通知?

您可以从服务类内部的
桌面
onDestroy
中删除该通知。 注:不保证这会起作用,在api 14及以上版本中,即使没有前台通知,服务仍可以运行,您可以返回START_STICKY,它将恢复您的服务,即使系统将其销毁,系统也将重新启动它

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

使用onDestroy()
。尽管文档中说它不能保证被调用,但我已经测试了多次,唯一没有被调用的情况是当系统终止进程时,但到那时,您的通知将被终止到,所以这没关系。

使用服务方法。

服务结束删除前台通知

@Override
public void onDestroy() {
    // mycleanup first
    stopForeground(true);
    super.onDestroy();
}
private static final int DEALY = 10000;
private Handler handler = new Handler();

...
handler.postDelayed(ensureSericeIsRunning, DELAY);
...

private Runnable ensureSericeIsRunning = new Runnable() {

    @Override
    public void run() {
        if (!isMyServiceRunning(getActivity())){
            //shut down notification
        } else {
            handler.postDelayed(ensureSericeIsRunning, DELAY);
        }
    }
};
使用


如果服务仍在使用以下代码运行,则在通知内定期检查(例如,
处理程序
):

public static boolean isMyServiceRunning(Context context) {
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))                           {
        if (MyService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}
如果不只是关闭通知

@Override
public void onDestroy() {
    // mycleanup first
    stopForeground(true);
    super.onDestroy();
}
private static final int DEALY = 10000;
private Handler handler = new Handler();

...
handler.postDelayed(ensureSericeIsRunning, DELAY);
...

private Runnable ensureSericeIsRunning = new Runnable() {

    @Override
    public void run() {
        if (!isMyServiceRunning(getActivity())){
            //shut down notification
        } else {
            handler.postDelayed(ensureSericeIsRunning, DELAY);
        }
    }
};

你试过调用
stopForground(true)
inside
onTaskRemoved()
?@NikolaDespotoski这对foregorund服务不是一个好方法。不,在我的情况下它不起作用,即使
START\u STICKY
也不会在KitKat中重新启动服务!!!你能分享你使用的是哪款手机吗?是的,它是Nexus 5和AOSP KitKat rom,也请检查这个链接,我在使用Galaxy s5的股票rom时没有遇到bug,两天前我使用的是CM11,相信我在AOSP上开发不是一个好主意,我上一个自由职业者应用程序有很多问题,在CM11上运行时,尝试还原到stock rom,并对其进行测试。您将看到在stock和AOSP上运行的差异。不,当操作系统终止服务时,通知不会终止!很好的建议,但请注意,每当服务被操作系统终止时,所有其他引用也将被删除!什么意思?通知管理器是否仍然可以取消通知?我相信这正是您需要的:虽然serivce将被终止,但下一次调用isMyServiceRunning将返回false,您可以取消通知。你能澄清一下是怎么回事吗?