服务被杀死时销毁前台通知

时间:2014-04-14 08:32:28

标签: java android

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

不幸的是,由于报告here我的服务在接收到我的服务中的广播但我的服务未被杀死的bug,但是我的logcat中看到了以下日志:

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

当它的父服务被OS杀死时,有没有销毁前台通知?

6 个答案:

答案 0 :(得分:1)

服务结束删除前台通知。

@Override
public void onDestroy() {
    // mycleanup first
    stopForeground(true);
    super.onDestroy();
}

答案 1 :(得分:1)

使用stopForeground:

@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)

您可以从服务类内的onStoponDestroy中删除通知。 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()方法。

相关问题