我有一个前台服务,可以从网上下载一些内容。
不幸的是,由于报告here我的服务在接收到我的服务中的广播但我的服务未被杀死的bug,但是我的logcat中看到了以下日志:
I/ActivityManager(449): Killing 11073:my-package-name/u0a102 (adj 0): remove task
当它的父服务被OS杀死时,有没有销毁前台通知?
答案 0 :(得分:1)
服务结束删除前台通知。
@Override
public void onDestroy() {
// mycleanup first
stopForeground(true);
super.onDestroy();
}
答案 1 :(得分:1)
@Override
public void onDestroy() {
// as the bug seems to exists for android 4.4
if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.KITKAT)
{
stopForeground(true);
}
super.onDestroy();
}
或
public void onTaskRemoved (Intent rootIntent)
{
// as the bug seems to exists for android 4.4
if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.KITKAT)
{
stopForeground(true);
}
}
答案 2 :(得分:1)
在通知中定期检查(例如Handler
)服务是否仍在使用以下代码运行:
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;
}
如果不只是关闭通知。
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);
}
}
};
答案 3 :(得分:0)
您可以从服务类内的onStop
或onDestroy
中删除通知。
P.S不能保证这可以工作,在api 14及以上服务即使没有前台通知仍然可以运行,你可以返回START_STICKY,即使系统销毁它也会带回你的服务,系统会重启它。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
答案 4 :(得分:0)
使用onDestroy()
。即使文档说它不能保证被调用,我已经多次测试了,唯一没有被调用的情况是系统杀死进程,但到那时你的通知将被杀死,所以没关系
答案 5 :(得分:0)
使用服务onTaskRemoved()方法。