Android应用被浅杀和深杀

2023-05-16

onTaskRemoved()方法在当用户移除应用的一个Task栈时被调用。也就是当用户在最近任务界面把该应用的一个task划掉时,或者在最近任务界面进行清理时。这两种情况下onTaskRemoved()都会被调用,但在大多Android机型上,这两种情况有所不同:第一种情况即应用被浅杀(用户只划掉这一个Task),该Task栈会被清理,但如果有后台service在运行,该应用的进程不会被杀掉,后台service仍然在运行。第二种即应用被深杀(用户在最近任务界面直接按清理按钮),该应用的进程会被直接杀掉,后台的service当然也停止了。对于不同的手机品牌和机型在最近任务进行各种清理时过程可能不太一样,但应用浅杀和深杀对于所有Android手机都是有普遍意义的。

下面分析在应用被浅杀和被深杀以及先浅杀再深杀后的生命周期:

浅杀:

04-21 17:55:13.733 8264-8264/com.qintong.test D/qintong: vCardService onTaskRemoved.
1.
深杀:
会出现两种情况:
(a).

 
1.
04-26 16:20:00.349 32674-32674/? D/qintong: Service onTaskRemoved.

04-26 16:21:01.621 2936-2936/? D/qintong: Service is being created.

04-26 16:21:01.628 2936-2936/? D/qintong: Service onStartCommand.

(b).

 
1.
04-21 17:59:58.397 8264-8264/com.qintong.test D/qintong: Service onCreate.

04-21 17:59:58.404 8264-8264/com.qintong.test D/qintong: Service onTaskRemoved.

浅杀+深杀 (service 的 onStartCommand 返回 STICKY):

 
1.
04-21 18:05:12.717 8264-8264/com.qintong.test D/qintong: Service onTaskRemoved.

04-21 18:05:29.214 9207-9207/com.qintong.test D/qintong: Service onCreate.

04-21 18:05:29.223 9207-9207/com.qintong.test D/qintong: Service onStartCommand.

我们来分析这几种情况:
(1).浅杀时:应用进程没被杀掉,service仍然在执行,service的onTaskRemoved()立即被调用。

(2).深杀时:有两种情况:第一种情况是深杀后直接调用onTaskRemoved()且service停止,过段时间后service重启调用其onCreate()和onStartCommand()。第二种是应用的进程被杀掉,过一会后service的onCreate()方法被调用,紧接着onTaskRemoved()被调用。由于被深杀后应用的进程立刻停止了,所以service的onTaskRemoved()无法被立即调用。而过若干秒后,service重启,onCreate()被调用,紧接着onTaskRemoved()被调用。而这里service的其他方法并没有被调用,即使onStartCommand()返回STICKY,service重启后onStartCommand()方法也没有被调用。

(3).浅杀+深杀时(service 的 onStartCommand 返回 STICKY):onTaskRemoved()立刻被调用(浅杀后),深杀后过段时间onCreate()和onStartCommand()相继被调用。执行浅杀Task被清理,应用的进程还在,onTaskRemoved()被调用,过程与(1)一样。再执行深杀:由于该应用的Task栈已经没有了,所有再深杀onTaskRemoved()不会再被调用,深杀后service停止。而由于实验时候onStartCommand()返回STICKY,所有service过段时间会被再次启动,执行了onCreate()方法和onStartCommand()方法。

所以综上所述,service的onTaskRemoved()在应用浅杀后会被立即调用而在service被深杀后,会直接调用onTaskRemoved或service会被重启并调用onTaskRemoved()。

回到我们的问题:应用被杀后,如何取消Notification:
我们先看最后的解决方案,在来分析为何能work。

service的代码如下:

 
1.
@Override

public void onCreate() {

super.onCreate();

mBinder=newMyBinder();

if(DEBUG) Log.d(LOG_TAG,"vCardService is being created.");

mNotificationManager= ((NotificationManager)getSystemService(NOTIFICATION_SERVICE));

initExporterParams();

}

 
@Override

public int onStartCommand(Intent intent, intflags, intid) {

if(DEBUG) Log.d(LOG_TAG,"vCardService onStartCommand.");

mNotificationManager.cancelAll();

returnSTART_STICKY;

}

 
@Override

public void onTaskRemoved(Intent rootIntent) {

if(DEBUG) Log.d(LOG_TAG,"vCardService onTaskRemoved.");

mNotificationManager.cancelAll();

super.onTaskRemoved(rootIntent);

}

如上代码,在浅杀时候:只执行onTaskRemoved(),通知被取消,但service仍然在运行,所以还会继续发通知,正常运行。
深杀时:第一种情况直接调用onTaskRemoved()且service停止,通知被取消。第二种情况,进程被杀掉,几秒后service重启,onCreate() -> onTaskRemoved(),运行结果就是深杀后过几秒后Notification被取消。
浅杀+深杀时:浅杀后onTaskRemoved()被调用,service仍在运行,通知仍然在更新。深杀时,onCreate() -> onStartCommand(),在onStartCommand()时候取消通知。
另外,mNotificationManager.cancelAll()会清除应用的所有通知,如果应用想保留和该service无关其他通知,可以调用mNotificationManager.cancel(String tag, int id)或cancel(int id)清除指定通知。
当然,还可以有另一种方式:浅杀时后就把service后台执行的任务停止,并清理notification,我们可以根据需求来选择。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android应用被浅杀和深杀 的相关文章

随机推荐

  • make: *** [out/target/common/obj/APPS/QuickSearchBox_intermediates/with-local/classes.dex] 错误 41

    报错信息 target thumb C 43 43 libv8 lt 61 out target product generic obj STATIC LIBRARIES libv8 intermediates experimental l
  • sh: 1: glxinfo: not found

    创建模拟器 xff0c 启动模拟器报报错如下 xff1a sh 1 glxinfo not found 处理3 xff1a sudo apt get install mesa utils
  • libGL error: unable to load driver: vmwgfx_dri.

    通过which emulator找到emulator命令执行路径 apt get install lib64stdc 43 43 6 确认你是否在你的系统中安装了lib64stdc 43 43 6 cd ANDROID HOME andro
  • 如何给Ubuntu正确地设置永久环境变量并立即生效

    1 什么是环境变量 环境变量 xff08 environment variables xff09 一般是指在操作系统中用来指定操作系统运行环境的一些参数 xff0c 这些参数会对系统行为产生影响 比如常用的PATH环境变量 xff0c 当要
  • NSURLCache使用的坑

    NSURLCache使用有许多限制 xff0c 苹果限制的 1 只能用在get请求里面 xff0c post可以洗洗睡了 2 缓存机制选择 NSURLRequestReturnCacheDataElseLoad 有缓存从缓存取数据 xff0
  • Volley源码解析

    概述 本文基于Volley 1 1 1版本的源码 Volley是Google官方出的一套小而巧的异步请求库 xff0c 该框架封装的扩展性很强 xff0c 支持HttpClient HttpUrlConnection xff0c 甚至支持O
  • Android Volley源码分析(1)

    1 Volley newRequestQueue 我们从Volley中RequestQueue的初始化入手 xff0c 开始进行分析 应用利用Volley java的静态方法 xff0c 获取RequestQueue xff0c 开启使用V
  • Android Volley源码分析(2)

    1 RequestQueue的add接口 我们从RequestQueue的add接口入手 xff1a public lt T gt Request lt T gt add Request lt T gt request Tag the re
  • 删除git remote

    目前项目中有两个remote git remote v origin https github com test test git fetch origin https github com test test git push test
  • 当 git pull 碰到拒绝合并无关历史

    问题描述 很久之前在 github 上建了个仓库 xff0c 里面只有一个 README md 文件 突然有天 xff0c 我想把本地的一个项目传上去 xff0c 然后就碰到了这样一个问题 xff01 当我 添加远程仓库 后准备提交代码时
  • rxjava2源码解析(一)基本流程分析

    从基本使用入手 首先随便写一个rxjava2的基本用法 xff0c 我们根据这个简单的示例来看看rxjava2整个流程是什么样的 Observable create new ObservableOnSubscribe lt String g
  • rxjava2源码解析(二)线程切换分析

    使用方法 还是先从最基本的使用开始看 xff1a Observable create new ObservableOnSubscribe lt String gt 64 Override public void subscribe Obse
  • rxjava2源码解析(三)observeOn线程池原理分析

    observeOn 还是先说observeOn 直接看源码 xff1a public ObservableObserveOn ObservableSource lt T gt source Scheduler scheduler boole
  • RxJava 2.x 源码分析 之 FlatMap

    FlatMap 官方定义 xff1a 把被观察者发射出去的事件转化成新的子被观察者 xff0c 然后把这些发射量展开平铺后统一放到一个被观察者中 官方文档 简单来讲就是把被观察者每次发射的事件转化成一个子被观察者 xff0c 然后通过合并
  • Transformer 在RxJava中的使用

    Transformer 用途 Transformer xff0c 顾名思义是转换器的意思 早在 RxJava1 x 版本就有了Observable Transformer Single Transformer和Completable Tra
  • 彻底理解kubernetes CNI

    kubernetes各版本离线安装包 CNI接口很简单 xff0c 特别一些新手一定要克服恐惧心里 xff0c 和我一探究竟 xff0c 本文结合原理与实践 xff0c 认真读下来一定会对原理理解非常透彻 环境介绍 我们安装kubernet
  • 将本地项目上传到远程Git服务器

    1 先进入项目文件夹 通过命令 git init 把这个目录变成git可以管理的仓库 git init 2 把文件添加到版本库中 xff0c 使用命令git add 添加到暂存区里面去 xff0c 小数点 34 34 意为添加文件夹下的所有
  • 解决Manifest merger failed : Attribute application@appComponentFactory

    在将butterknife升级到10 0 0的时候遇到问题 xff0c 编译无法通过 Manifest merger failed Attribute application 64 appComponentFactory value 61
  • bindService不能触发onServiceConnected方法的原因

    在android项目中用到AIDL xff0c bindService service connection BIND AUTO CREATE 之后一直不调用 connection中的onServiceConnected方法 可能原因1 1
  • Android应用被浅杀和深杀

    onTaskRemoved 方法在当用户移除应用的一个Task栈时被调用 也就是当用户在最近任务界面把该应用的一个task划掉时 xff0c 或者在最近任务界面进行清理时 这两种情况下onTaskRemoved 都会被调用 xff0c 但在