Android - 禁用权限后,进程被杀?

Logcat 的日志没了,并且 app 的所有进程都被杀了,一个也没留。

从最近任务列表或桌面 Icon 点击 app,白屏了一小会儿,然后崩了。

进程新建,然后重建栈顶的 activity,然而如果程序读取在内存中存的对象时,发生了 npe 造成崩溃。

这。。。

试试微信去。

我惊了。微信它重启了,重新走冷启动流程。

为啥 app 进程会被干掉


可以看看 Android marshmallow dynamic permission change kills all application processes

在线考古!

既然这是 Android 系统的机制,那我们想想办法在这种情况下,怎么能让 app 不崩溃吧。

解决方法


onCreate 中判断 bundle != null

很多人考虑在基类的 onCreate 方法中判断 bundle 是否为 null,来判定 activity 被重建。 这个做法的依据是,权限禁止后,再打开 app,栈顶的 activity 的 onCreate 方法的 bundle 不为 null,存了一些系统自动传入的 bundle。

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

if (savedInstanceState != null) {

val intent = Intent(this, LaunchActivity::class.java)

intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK

startActivity(intent)

overridePendingTransition(0, 0)

finish()

}

}

但是如果在程序有需求存 bundle 时,这个方法是不是就不适用了呢 ~

通过 ActivityLifecycleCallbacks

另外发现的一种方法: 在Application 定义一个Boolean类型的属性,isKilled = true 默认为true, 注册 ActivityLifecycleCallbacks 回调,在onActivityCreated 方法,先判断activity 是否是Launch ,若是则将Application.isKilled 赋值为false。若不是Launch 判断 Application.isKilled 是否为true, 若是true 说明 Application 被重建了,这时候跳转到Launch并杀掉刚重建的Activity # 应用压到后台,关闭应用某个权限后,应用无法正常使用

具体实现:

自定义 PreventProcessKill 类,并实现 Application.ActivityLifecycleCallbacks 接口

class PreventProcessKill: Application.ActivityLifecycleCallbacks {

companion object {

const val TAG = “PreventProcessKill”

}

private var activityCount = 0

override fun onActivityCreated(activity: Activity?, bundle: Bundle?) {

Logs.e(TAG, “onActivityCreated activity=( a c t i v i t y ) b u n d l e = ( activity) bundle=( activity)bundle=(bundle)”)

if (activity != null && activity is LaunchActivity) {

if (activityCount == 0 || activity.isTaskRoot()) {

Logs.e(TAG, "onActivityCreated set isKilled false ")

MyApplication.isKilled = false

}

}

if (MyApplication.isKilled) {

Logs.e(TAG, “onActivityCreated isKilled == true, start restartApp”)

// 进程被杀死,重启app

restartApp(activity);

return;

}

}

override fun onActivityStarted(activity: Activity?) {

Logs.e(TAG, “onActivityStarted activity=$activity”)

activityCount++

}

override fun onActivityResumed(activity: Activity?) {

Logs.e(TAG, “onActivityResumed activity=$activity”)

}

override fun onActivityPaused(activity: Activity?) {

Logs.e(TAG, “onActivityPaused activity=$activity”)

}

override fun onActivityStopped(activity: Activity?) {

Logs.e(TAG, “onActivityStopped activity=$activity”)

activityCount–

}

override fun onActivitySaveInstanceState(activity: Activity?, bundle: Bundle?) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。

这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

毕竟不管遇到什么样的面试官,去面试首先最主要的就是自己的实力,只要实力够硬,技术够强,就不怕面试拿不到offer!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

[外链图片转存中…(img-Tw8DN9iB-1712606179583)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值