Android进程运行中权限被收回导致关闭的问题解决
作者:临木小屋 发布时间:2023-11-21 16:56:45
流程如图:
MainActivity 跳转至 MainActivity2 再跳转至 MainActivity3MainActivity3
跳转至 设置,收回权限
一路返回
运行log如下
// 一路跳转,打开设置,收回权限
com.miss.soullink E/MainActivity: == onCreate == 25149
com.miss.soullink E/MainActivity: == onCreate == savedInstanceState null
com.miss.soullink E/MainActivity2: == onCreate == 25149
com.miss.soullink E/MainActivity3: == onCreate == 25149
// 返回时的
com.miss.soullink E/MainActivity3: == onCreate == 27596
com.miss.soullink E/MainActivity2: == onCreate == 27596
com.miss.soullink E/MainActivity3: == onDestroy == MainActivity3
com.miss.soullink E/MainActivity: == onCreate == 27596
com.miss.soullink E/MainActivity: == onCreate == savedInstanceState Bundle[{android:viewHierarchyState=Bundle[mParcelledData.dataSize=944], androidx.lifecycle.BundlableSavedStateRegistry.key=Bundle[{}], android:lastAutofillId=1073741823, android:fragments=android.app.FragmentManagerState@6d44964}]
com.miss.soullink E/MainActivity2: == onDestroy == MainActivity2
进程重启原因
权限收回后进程的id发生了变化,即运行中的程序在权限被收回后会强制重启,并记录了响应的activity栈信息。MainActivity2的onCreate方法在MainActivity3的onCreate后面调用,虽然activity的顺序得到了保存,但这是一个不安全的进程。好多初始化工作或者信息传递得不到保证!!
后面了解iOS机制,运行的iOS进程被收回权限后会重启进程但不会自动回到关闭时的页面,但Android却会!
进程重启后的处理
为保证进程的安全性,在系统重启app进程后,我们决定再次重启进程并回到登录界面。即权限收回后app重启进程两次
判断条件:因系统关闭进程属于异常关闭,savedInstanceState不为空,以此做判断进行二次重启进程。为保证安全性,可以把已有的权限做下对比与之前的权限做下对比,增强代码的健壮性。
除了权限收回还有别的情况也会导致进程异常关闭,多一层判断,少被领导干~
// 杀死并重启进程
fun restartApp(context: Context) {
val intent = context.packageManager.getLaunchIntentForPackage(context.packageName)
val restartIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT)
// 设置杀死应用后1秒重启
val mgr: AlarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent)
// 重启应用
android.os.Process.killProcess(android.os.Process.myPid())
}
来源:https://blog.csdn.net/xihuailu3244/article/details/120994362
猜你喜欢
- 由其他进制转换为十进制比较简单,下面着重谈一谈十进制如何化为其他进制。1.使用Java带有的方法Integer,最简单粗暴了,代码如下//使
- 本文实例讲述了Java简单实现调用命令行并获取执行结果。分享给大家供大家参考,具体如下:import java.io.BufferedRea
- 1. 需要事先将jar包 放在kettle 的 libext 目录,kettle 在启动时会自动加载libext 目录下的所有 jar 包。
- 没有结果时,去.First()时,会报错,所以一定要先.Count()判断一下而用FirstOrDefault(),如果集合中没有数据,则返
- 一、简介在上篇 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用。实际的项目开发过程中
- 小编今天研究了在Unity3D中的数据持久化问题。数据持久化在任何一个开发领域都是一个值得关注的问题,小到一个应用中配置文件的读写,大到数据
- 多数据源创建数据库CREATE DATABASE mybatis_plus_1;USE mybatis_plus_1;CREATE TABL
- 目录一、String的用法1.构造方法2.求字符串长度和某一位置字符3.提取子串4.字符串比较5.字符串链接6.字符串中单个字符查找7.大小
- 简介java 8 stream作为流式操作有两种操作类型,中间操作和终止操作。这两种有什么区别呢?我们看一个peek的例子:Stream&l
- 本文初步探讨了C#缓存的原理及应用,并以实例加以分析总结,这些对C#初学者来说是很有必要熟练掌握的内容。具体如下:一、概述:缓存应用目的:缓
- 1. Ajax 概述Ajax 的英文全称是 ”Asynchronous JavaScript and XML&l
- 前言需求使用freemarker生成的静态文件,统一存储在某个服务器上。本来一开始打算使用ftp实现的,奈何老连接不上,改用jsch。毕竟有
- 引导语线程池我们在工作中经常会用到。在请求量大时,使用线程池,可以充分利用机器资源,增加请求的处理速度,本章节我们就和大家一起来学习线程池。
- mybatis in foreach 双层嵌套需求:根据角色id,返回角色名称,入参是List<List> 类型的二维数组,需要
- 这几天看了下之前写的有关微信支付的博客,看的人还是挺多的,看了下留言不知道是因为博客写的不够细还是什么情况,大多都找我要源码,我觉得吧程序员
- 出错信息:Unknown error (0xffffffff)at System.Diagnostics.Process.StartWith
- 前言 侧滑的实现方式有很多方式来实现,这次总结的ViewDragHe
- 使用 transient 修饰private transient String noColumn;使用 static 修饰private s
- /// <summary> /// 读写INI文件的类。
- 1 使用阿里的FastJson1.1 项目的pom.xml依赖<dependency> <groupId>com.a