当前位置: 首页 > news >正文

Android程序完全退出

有几个activity,有一需求是在一个activityA点击back键退出系统而不是跳到之前的activity
 
    首先想到的是清空activityA的堆栈,使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 但是该activityA不是已经存在于
 
堆栈底端的,所以清除的只是堆栈中该activityA上面的activity,但后退后还是会返回堆栈中该activityA下面的activity。
 
    然后想到的是截获back按键的事件,使用System.exit(0)和android.os.Process.killProcess(android.os.Process.myPid())来退
 
出程序,还是不行,当前的activityA是被干掉了,但是还是会被ActivityManager接管返回到前一个activity。而且如果之前activity需要一
 
些传过来的参数的话会导致程序连续抛异常。
 
    最后终于找到一个可行的方法:使用ActivityManager彻底退出程序
 
ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);   
 
manager.restartPackage(getPackageName()); 
 
需要声明权限<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
 
这种方法会终止一切和这个程序包关联的,所有共享同一uid的process被kill,所有的activity会被removed
 
所有创建的服务会停止,还会发一个广播   
 
Intent.ACTION_PACKAGE_RESTARTED
 
导致所有注册alarms 被stopped, notifications 被removed。
 
   这几天刷了2.2的rom发现restartPackage方法无效,网上搜了下答案:
 
 在Android 2.2中新增了一个API可以帮助我们杀死后台进程,不过Android123再次强调其调用的API Level最小为8,
 
killBackgroundProcesses是android.app.ActivityManager类的方法,使用时必须在androidmanifest.xml文件中加入
 
KILL_BACKGROUND_PROCESSES这个权限。虽然本类还提供了restartPackage (String packageName) 方法调用的API Level为
 
3,但是SDK中已经标记为deprecated,其实他们的原理都是一样的,只不过过去Google的命名方式确实不是很合理,restartPackage
 
的作用很难让我们联想到是结束进程。

 

 

   该方法的原型 public void killBackgroundProcesses (String packageName)  仅有一个参数为package Name,使用方法比较简

 

单。

 

 

   ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 

 

   am.killBackgroundProcesses("cn.com.android123.cwj");   // API Level至少为8才能使用

 

所以要用此方法最好加个判断如果是2.2之前的rom就用restartPackage之后的就用killBackgroundProcesse

相关文章:

  • P2-2017级算法第二次上机 B 女娲加农炮
  • 很好的学习平台
  • 前言-如何学习区块链
  • 移除孤立的或已删除的链接克隆
  • Windows 8.1 Windows Phone 8.1 通用程序
  • HowTos/Virtualization/VirtualBox - CentOS Wiki
  • MySQL 运维笔记(一)—— 终止高负载SQL
  • Kubernetes部署(九):CoreDNS、Dashboard、Ingress部署
  • ES6 Promise
  • 什么是字符串常量池
  • Shell实战训练营Day11
  • java并发处理 (同步与原子性)
  • Java入门项目:学生信息管理系统V2
  • IE6不支持a标签以外元素的hover的解决方案
  • 40个Java多线程问题详解复习
  • 2018一半小结一波
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Babel配置的不完全指南
  • JavaScript 奇技淫巧
  • javascript 总结(常用工具类的封装)
  • leetcode46 Permutation 排列组合
  • MYSQL 的 IF 函数
  • node-glob通配符
  • PHP面试之三:MySQL数据库
  • Python 反序列化安全问题(二)
  • VuePress 静态网站生成
  • 包装类对象
  • 后端_MYSQL
  • 机器学习中为什么要做归一化normalization
  • 基于游标的分页接口实现
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 网络应用优化——时延与带宽
  • 智能合约开发环境搭建及Hello World合约
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 函数计算新功能-----支持C#函数
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2015)JS ES6 必知的十个 特性
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (学习日记)2024.01.09
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能