Android彻底退出应用程序

Android--关闭某个指定activity,深入浅出安卓开发 WeakReference以及JVM相关,虽然WeakReference被static了,生命周期变长了,但是WeakReference关联的对象不受影响的,依然遵循WeakReference在gc时候的规则。优劣: 优点:代码简单直观,引入WeakReference,解决了内存泄漏问题。缺点:在每个activity中都要添加,代码量多。(不知是否可抽取到基类中,以后尝试)##方案三。 阅读详情

http://www.eoeandroid.com/home.php?mod=space&uid=588465&do=blog&id=2667

做android开发时,发现一个关于android退出时不能彻底关闭的问题,比如:一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:System.exit(0);

-=====-=-=-=-=-=======-----=====

1. finish()方法

该方法可以结束当前 Activity,但是如果你的App有很多 Activity 的话,使用该方法显得有点捉襟见肘了。

另外,还有一个方法finishActivity (int requestCode) ,关于这个方法,先看看sdk的api说明吧!

 
  1. public void finishActivity (int requestCode)
  2. Since: API Level 1
  3. Force finish another activity that you had previously started with startActivityForResult(Intent, int).
  4. Parameters requestCode The request code of the activity that you had given to startActivityForResult(). If there are multiple activities started with this request code, they will all be finished.

也许你会这样理解 ,Activity1 通过方法 startActivityForResult (Intent, int) 启动 Activity2,然后在 Activity2 中通过方法finishActivity (int requestCode)来结束 Activity1,但是很不幸运,不是这样的。不信你可以Demo一把!

上面文档说得很明白,该方法强制关闭通过方法 startActivityForResult (Intent, int) 启动的 Activity,也就是说在 Activity1 中的(重写)方法onActivityResult(int requestCode, int resultCode, Intent data) 来接收 Activity2 返回的结果,必须在 Activity1 中调用finishActivity (int requestCode)来结束 Activity2。(一般在onActivityResult 方法调用该方法结束 Activity2)。

 
  1. Force finish another activity that you had previously started with startActivityForResult(Intent, int).
  2. Parameters

还有,下面两个方法,可以参阅文档以及源码研究一下。

 
  1. finishActivityFromChild(Activity child, int requestCode)
  2. finishFromChild(Activity child)

2. killProcess

通过调用 android.os.Process 的相关方法,结束 App,示例如下:

 
  1. btn_exit.setOnClickListener(new Button.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. android.os.Process.killProcess(android.os.Process.myPid());
  5. }
  6. });

3. exit

我们知道,Java 的 exit(int code) 方法可以退出程序,通过查看该方法源码,知道它实际上是调用下面的方法:

 
  1. Runtime.getRuntime().exit(code);

示例代码,如下所示:

  1. btn_exit.setOnClickListener(new Button.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. System.exit(0);//正常退出App
  5. }
  6. });

接下来,我们研究一下这个方法。java.lang.System这个类的该方法jdk说明:

  1. exit
  2. public static void exit(int status)
  3. 终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
  4. 该方法调用 Runtime 类中的 exit 方法。该方法永远不会正常返回。
  5. 调用 System.exit(n) 实际上等效于调用:
  6. Runtime.getRuntime().exit(n)
  7. 参数:
  8. status - 退出状态。
  9. 抛出:
  10. SecurityException - 如果安全管理器存在并且其 checkExit 方法不允许以指定状态退出。
  11. 另请参见:
  12. Runtime.exit(int)

也就是说,参数为非0值的话是异常退出程序。参数为0的话,就是正常退出。

看RunTime这个类的该方法源码:

  1. public void exit(int status) {
  2. SecurityManager security = System.getSecurityManager();
  3. if (security != null) {
  4. security.checkExit(status);
  5. }
  6. Shutdown.exit(status);
  7. }

其api说明:

  1. exit
  2. public void exit(int status)
  3. 通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。此方法从不正常返回。可以将变量作为一个状态码;根据惯例,非零的状态码表示非正常终止。
  4. 虚拟机的关闭序列包含两个阶段。在第一个阶段中,会以某种未指定的顺序启动所有已注册的关闭钩子 (hook)(如果有的话),并且允许它们同时运行直至结束。在第二个阶段中,如果已启用退出终结,则运行所有未调用的终结方法。一旦完成这个阶段,虚拟机就会暂停。
  5. 如果在虚拟机已开始其关闭序列后才调用此方法,那么若正在运行关闭钩子,则将无限期地阻断此方法。如果已经运行完关闭钩子,并且已启用退出终结 (on-exit finalization),那么此方法将利用给定的状态码(如果状态码是非零值)暂停虚拟机;否则将无限期地阻断虚拟机。
  6. System.exit 方法是调用此方法的一种传统而便捷的方式。
  7. 参数:
  8. status - 终止状态。按照惯例,非零的状态码表明非正常终止。
  9. 抛出:
  10. SecurityException - 如果安全管理器存在,并且其 checkExit 方法不允许存在指定的状态
  11. 另请参见:
  12. SecurityException, SecurityManager.checkExit(int), addShutdownHook(java.lang.Thread), removeShutdownHook(java.lang.Thread), runFinalizersOnExit(boolean), halt(int)

该方法又是调用Shutdown这个类的exit()方法。

  1. static void exit(int status) {
  2. boolean runMoreFinalizers = false;
  3. synchronized (lock) {
  4. if (status != 0) runFinalizersOnExit = false;
  5. switch (state) {
  6. case RUNNING: /* Initiate shutdown */
  7. state = HOOKS;
  8. break;
  9. case HOOKS: /* Stall and halt */
  10. break;
  11. case FINALIZERS:
  12. if (status != 0) {
  13. /* Halt immediately on nonzero status */
  14. halt(status);
  15. else {
  16. /* Compatibility with old behavior:
  17. * Run more finalizers and then halt
  18. */
  19. runMoreFinalizers = runFinalizersOnExit;
  20. }
  21. break;
  22. }
  23. }
  24. if (runMoreFinalizers) {
  25. runAllFinalizers();
  26. halt(status);
  27. }
  28. synchronized (Shutdown.class) {
  29. /* Synchronize on the class object, causing any other thread
  30. * that attempts to initiate shutdown to stall indefinitely
  31. */
  32. sequence();
  33. halt(status);
  34. }
  35. }

其中,runAllFinalizers()是一个本地方法:

  1. JNIEXPORT void JNICALL
  2. Java_java_lang_Shutdown_runAllFinalizers(JNIEnv *env, jclass ignored)
  3. {
  4. jclass cl;
  5. jmethodID mid;
  6. if ((cl = (*env)->FindClass(env, "java/lang/ref/Finalizer"))
  7. && (mid = (*env)->GetStaticMethodID(env, cl,
  8. "runAllFinalizers""()V"))) {
  9. (*env)->CallStaticVoidMethod(env, cl, mid);
  10. }
  11. }

System.exit()的参数是把退出原因返回给系统, 一般来说可以是任何的整数 。

0表示正常退出,1表示非正常 。

最后说一下finish()与exit方法的区别:

finish()是Activity的类方法,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;当调用System.exit(0)时,退出当前Activity并释放资源(内存),但是该方法不可以结束整个App如有多个Activty或者有其他组件service等不会结束。

其实android的机制决定了用户无法完全退出应用,当你的application最长时间没有被用过的时候,android自身会决定将application关闭了。


4. restartPackage方法

  1. ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  2. manager.restartPackage(getPackageName());

首先需要创建ActivityManager对象,然后调用restartPackage()方法(如果有兴趣的话,可以看源码)。

注意:getPackageName获得当前应用包名称,如mark.zhang

使用这种方式来退出App,需要权限:

  1. <uses-permission android:name="android.permission.RESTART_PACKAGES" />

更加详细的说明,如下:

  1. void android.app.ActivityManager.restartPackage(String packageName)
  2. Have the system perform a force stop of everything associated with the given application package. All processes that share its uid will be killed, all services it has running stopped, all activities removed, etc. In addition, a Intent.ACTION_PACKAGE_RESTARTED broadcast will be sent, so that any of its registered alarms can be stopped, notifications removed, etc.
  3. You must hold the permission android.Manifest.permission.RESTART_PACKAGES to be able to call this method.
  4. Parameters:
  5. packageName The name of the package to be stopped.

可以看出,相同的UID的进程会被kill,还会停止相关的服务以及移除所有的Activity,并且会发送一个广播。


注意一个问题:在android2.2之后,该方法不可以将应用程序结束,需要使用ActivityManager类的下面这个方法:

  1. public void killBackgroundProcesses (String packageName)

api 文档说的很清楚:

  1. public void restartPackage (String packageName)
  2. Since: API Level 3
  3. This method is deprecated.
  4. This is now just a wrapper for killBackgroundProcesses(String); the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.

另外,需要使用权限:

  1. <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

但是不管你怎么样折腾,还是无法退出App,呜呼哀哉!这里给出一个方法:

  1. int currentVersion = android.os.Build.VERSION.SDK_INT;
  2. if (currentVersion > android.os.Build.VERSION_CODES.ECLAIR_MR1) {
  3. Intent startMain = new Intent(Intent.ACTION_MAIN);
  4. startMain.addCategory(Intent.CATEGORY_HOME);
  5. startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  6. startActivity(startMain);
  7. System.exit(0);
  8. else {// android2.1
  9. ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  10. am.restartPackage(getPackageName());
  11. }


关于android.os.Build.VERSION.SDK_INT,可以参考 http://blog.csdn.net/androidbluetooth/article/details/6778422


android 退出activity 的方式总结 android中使用:[activityname].this.finish();  只是退出了activity的堆栈中,要真正的退出程序在手机cpu中的运行,当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 一   使用killProcess()函数,首先获取当前进程的id,然后杀死该进程: android.os.Process.killP 阅读详情

相关推荐

优雅退出Android应用程序:正确关闭Activity

通过在主Activity中管理全局的Activity列表,并在每个Activity的生命周期方法中添加和移除Activity,我们可以确保所有的Activity都能正确地关闭。当用户完成某个任务或者希望退出应用程序时,我们需要确保所有的Activity都正确地关闭,以释放资源并终止应用程序的运行。这样,当一个Activity被销毁时,它会自动从全局的Activity列表中移除,避免了潜在的内存泄漏问题。需要注意的是,为了确保应用程序的稳定性,我们可以在Activity的。方法,从而退出应用程序

CyberGenius的博客 495

android_基础_权限大全

转载自: https://www.cnblogs.com/shiwei-bai/p/4916794.html 1 android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.FLASHLIGHT 访问闪光灯,android开发网提示HTC .

写bug的蚊子的博客 3182

GLM-4本地部署的实战教程

本文主要介绍了GLM-4-9B本地部署的实战教程,希望对学习和使用大模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 下载模型文件 3. 运行glm-4-9b-chat

herosunly的博客 25万+

使用easypermissions,申请android动态权限。

使用easypermissions配置android的app应用权限。android6以上需要动态申请权限。 reposition: http://jcenter.bintray.com/pub/devrel/easypermissions/0.4.3/ sample: https://gi...

chonggong6368的博客 786

android按back键彻底退出应用程序的方法

android

yiyudemei的专栏 1577

android 彻底退出应用程序在不同API下需要调用的方法

一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:System.exit(0);   1. finish()方法 该方法可以结束当前 Activity,但是如果你的App有很多 Activity 的话,使用该方法显得有点捉襟见肘了。 另外,还有一个方法finis

成长的味道 2206

Android彻底退出,解决应用程序退出不完全

问题描述 退出流程: 子页面——&gt;主页面——&gt;退出登录——&gt;登录页面——&gt;完全退出 每个页面在关闭的时候都写了finish(),但还是会出现退出不完全的现象,例如: 子页面——&gt;主页面——&gt;退出登录——&gt;登录页面——&gt;主页面——&gt;退出登录——&gt;登录页面——&gt;完全退出 由于主页面和登录页面重复显示,所以在登录页面退出时加了System...

weixin_42824294的博客 7752

android彻底退出应用_Android退出应用程序方法总结

退出图在Android开发中,我们运行了应用程序后,都需要退出应用的,那么该如何退出应用,又都有哪些实现方式呢?今天就为大家整理分享一些退出应用程序的方法,一起来看看吧!更新内容Ver:v1任务管理器方法补充新增监听式退出方法Ver:v2任务管理器方法修正新增销毁任务栈退出方法1. finish方法finish();该方法只是结束当前Activity,系统将最上面的Activity移出了栈,并没有...

weixin_42509196的博客 3808

android彻底退出应用_android完全退出应用程序

android 完全退出应用程序android android 退出应用程序, 单例模式管理Activity引自:http://www.yoyong.com/archives/199android 退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(...

weixin_39559804的博客 931

android彻底退出应用_Android完全退出应用程序的方法

本文实例讲述了Android完全退出应用程序的方法。分享给大家供大家参考。具体如下:在Android中,如果想退出Android程序,一般都是调用finish()、System.exit(0)、android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,这是因为调用...

weixin_42519772的博客 2409

android彻底退出应用_android——彻底关闭——应用程序

最近学习做android的游戏开发时候,发现一个关于android退出时不能彻底关闭的问题,比如:一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:System.exit(0);1. finish()方法该方法可以结束当前 Activity,但是如果你的App有很多 Activity ...

weixin_39559071的博客 958

Android各种访问权限Permission详解

Android的设计中,资源的访问或者网络连接,要得到这些服务都需要声明其访问权限,否则将无法正常工作。在Android中这样的权限有很多种,这里将各类访问权限一一罗列出来,供大家使用时参考之用。 android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST

书生的博客 5025

Android permission权限列表

<!-- p {margin-bottom:0.21cm} --> 以下信息都是需要添加在Androidmanifest.xml文件中。   publicstatic final StringBROADCAST_PACKAGE_REMOVED 允许应用程序发出一个应用程序被删除的通知。 常量值:"android.permission.BROADCAST_PACK

勤穷追梦 1429

Android权限设置android.permission完整列表

Android项目开发过程中,经常会碰到很多用户权限的

sean的技术博客 7901

Android App 退出解决方案

1. Dalvik VM的本地方法android.os.Process.killProcess(android.os.Process.myPid()) //获取PID System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出2. 任务管理器方法 首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限 android

飞天小牛的专栏 951

android权限(permission)大全

1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SYNC_SETTINGS写入Google在线同步设置 3.android.permission.WRITE_SOCIAL_STREAM读取用户的社交信息流 4.android.permission.WRITE_SMS允许程序写短信 5.android.permission.WRITE_SETTINGS允许程序读取或写入系统设置

易寻资料的博客 7210

实战|2026美团&大众点评餐饮数据抓取:Playwright/Selenium反爬全攻略

核心结论:2026年美团&大众点评的反爬核心是“多维度风控”,需组合使用“住宅IP+设备指纹伪装+真人行为模拟+动态验证处理”,Playwright是最优工具,Selenium仅作为补充。效率优化:单机爬取速度建议控制在“每小时500-800条”,避免高频请求触发风控;分布式爬取需确保每个节点使用独立住宅IP,且行为轨迹不一致。扩展方向集成WASM解密工具,破解2026年美团的Token加密;用AI识别动态点选验证,提升验证通过率;对接大数据平台,对抓取的餐饮数据进行可视化分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2407

GRACE水储量解算_read_gldas_GLDAS_IWant!IWant_use

I want to use this code to read data from GLDAS.

上一篇: 你真的有必要退出吗——再说Android程序的退出功能
下一篇: 修改CSDN Blog的“聚合 | xml”链接为自己烧的feed
forlong401
博客等级 码龄22年 1136粉丝 234原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值