Android应用程序的完全退出
16lz
2021-01-23
本人博客原文 在Android中,即使我们退出了所有的Activity。但是其应用程序并不能结束,系统还有继续保持其一段时间。 关于此的更多内容请参照《 Task和Activity相关的一些属性 》中,关于 android:alwaysRetainTaskState等相关的介绍。 然而我们可以在 根Acitivity的onDestroy() 方法中,做一些操作来让该应用程序彻底退出,即进程结束。 我现在测试并有效的方法有 System.exit(0) 和 android.os.Process.killProcess(android.os.Process.myPid()) 这两种方法。网上有人反应这两种方法无效,我想他们可能是没在 根Acitivity 的onDestroy() 使用他们。 上面这两种方法在非根Activity中使用时,的确无效 。
如果你还不知道什么样的 Acitivity 称之为为 根Acitivity 的话,请参阅《 Activity和Task的基本模型 》和《 Task和Activity相关的一些属性 》 示例程序1: protected voidonDestroy() { super.onDestroy(); System.exit(0); //或android.os.Process.killProcess(android.os.Process.myPid()); Log.d(tag,"onDestroy"); } 示例程序2 (自己的Application中)
如果你还不知道什么样的 Acitivity 称之为为 根Acitivity 的话,请参阅《 Activity和Task的基本模型 》和《 Task和Activity相关的一些属性 》 示例程序1: protected voidonDestroy() { super.onDestroy(); System.exit(0); //或android.os.Process.killProcess(android.os.Process.myPid()); Log.d(tag,"onDestroy"); } 示例程序2 (自己的Application中)
private final static HandlerThread business0HandlerThread = new HandlerThread ( "Business0Handler" ); private static Handler business0Handler ; public static Handler getBusiness0Handler () { if ( business0Handler == null ) { synchronized ( business0HandlerThread ){ if ( business0Handler == null ) { business0HandlerThread . start (); business0Handler = new Handler ( business0HandlerThread . getLooper ()); } } } return business0Handler ; } /* * 在这里判断是否还有工作在进行 */ public boolean isAnyWorkGoing () { return false ; } ActivityManager am ; public boolean shouldKill () { if ( isAnyWorkGoing ()) { return true ; } else { if ( am == null ) { for ( int i = 0 ; i < 5 ; i ++) { am = ( ActivityManager ) getSystemService ( Context . ACTIVITY_SERVICE ); if ( am != null ) break ; try { Thread . sleep ( 50 ); } catch ( InterruptedException e ) { e . printStackTrace (); } } } List < RunningTaskInfo > runningTasks = am . getRunningTasks ( 100 ); for ( RunningTaskInfo task : runningTasks ) { ComponentName baseActivity = task . baseActivity ; if ( baseActivity != null && task . baseActivity . getClassName (). startsWith ( "cn.edu.edut.robin" )) { if ( task . numRunning > 0 ) { Log . d ( TAG , task . baseActivity . getClassName () + task . numRunning ); flgKillLoop = false ; return true ; } } } } return false ; } boolean flgKillLoop = false ; public void signKill () { flgKillLoop = true ; getBusiness0Handler (). post ( killRunable ); } Runnable killRunable = new Runnable () { @Override public void run () { if ( shouldKill ()) { android . os . Process . killProcess ( android . os . Process . myPid ()); } else if ( flgKillLoop ) { getBusiness0Handler (). postDelayed ( killRunable , 60 * 1000 ); } } };结束
更多相关文章
- Android自定义View的实现方法,带你一步步深入了解View(三) 。
- 【移动开发】Android中图片过大造成内存溢出,OOM(OutOfMemory)异常
- Android 超简单的录制屏幕视频及生成GIF文件的方法
- Android仿淘宝首页UI(附代源代码及示例图片)
- Android处理图片OOM的若干方法小结
- exp:Android Studio调试系统源码的方法 (干货分享)
- android activity 基类 通用方法
- Android 反射获取私有方法,成员变量
- Android 杀掉自己进程的方法