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)
insideonTaskRemoved()
?@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,您可以取消通知。你能澄清一下是怎么回事吗?