Android 彻底退出(关闭)应用程序

做android开发时,发现一个关于android退出时不能彻底关闭的问题,比如:一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:it(0);
 
-----------------------------------------------------------------------------
前言:
 
finish():结束当前Activity,不会立即释放内存。遵循android内存管理机制。
 
 
exit():结束当前组件如Activity,并立即释放当前Activity所占资源。
 
 
killProcess():结束当前组件如Activity,并立即释放当前Activity所占资源。
 
 
restartPackage():结束整个App,包括service等其它Activity组件。
 
1. finish()方法
 
该方法可以结束当前Activity,但是如果你的App有很多Activity 的话,使用该方法显得有点捉襟见肘了。
 
另外,还有一个方法finishActivity (int requestCode) ,关于这个方法,先看看sdk的api说明吧!
 
 
    public voidfinishActivity (int requestCode)
    Since: APILevel 1
    Force finishanother activity that you had previously started withstartActivityForResult(Intent, int).
    ParametersrequestCode The request code of the activity that you had given tostartActivityForResult(). If there are multiple activities started with thisrequest code, they will all be finished. 
 
也许你会这样理解 ,Activity1 通过方法startActivityForResult (Intent, int) 启动Activity2,然后在Activity2 中通过方法finishActivity (intrequestCode)来结束Activity1,但是很不幸运,不是这样的。不信你可以Demo一把!
 
上面文档说得很明白,该方法强制关闭通过方法startActivityForResult (Intent, int)启动的Activity,也就是说在Activity1 中的(重写)方法onActivityResult(intrequestCode, int resultCode, Intent data) 来接收Activity2返回的结果,必须在Activity1 中调用finishActivity(int requestCode)来结束Activity2。(一般在onActivityResult 方法调用该方法结束Activity2)。
 
 
    Force finishanother activity that you had previously started withstartActivityForResult(Intent, int).
    Parameters 
 
还有,下面两个方法,可以参阅文档以及源码研究一下。
 
 
   finishActivityFromChild(Activity child, int requestCode)
   finishFromChild(Activity child) 
 
2. killProcess
 
通过调用android.os.Process 的相关方法,结束App,示例如下:
 
 
   btn_exit.setOnClickListener(new Button.OnClickListener() {
    @Override
    public voidonClick(View v) {
   android.os.Process.killProcess(android.Pid());
    }
    }); 
 
3. exit
 
我们知道,Java 的exit(int code) 方法可以退出程序,通过查看该方法源码,知道它实际上是调用下面的方法:sis压片
 
 
  &Runtime().exit(code); 
 
示例代码,如下所示:
 
   btn_exit.setOnClickListener(new Button.OnClickListener() {
    @Override
    public voidonClick(View v) {
  &it(0);//正常退出App
    }
    }); 
 高空施工
接下来,我们研究一下这个方法。java.lang.System这个类的该方法jdk说明:
 
    exit
 
    public staticvoid exit(int status)
    终止当前正在运行的Java 虚拟机。参数用作状态码;根据惯例,非0 的状态码表示异常终止。
    该方法调用Runtime 类中的exit 方法。该方法永远不会正常返回。
 
    调用it(n) 实际上等效于调用:
 
  &Runtime().exit(n)
 
    参数:
成人保健药品    status - 退出状态。
    抛出:
   SecurityException - 如果安全管理器存在并且其checkExit 方法不允许以指定状态退出。
    另请参见:
  &it(int) 
 
也就是说,参数为非0值的话是异常退出程序。参数为0的话,就是正常退出。
 
看RunTime这个类的该方法源码:
 
    public voidexit(int status) {
   SecurityManager security =&SecurityManager();
    if (security!= null) {
   security.checkExit(status);
    }
  &it(status);
    } 
 
其api说明:
 
    exit
 
    public voidexit(int status)
    通过启动虚拟机的关闭序列,终止当前正在运行的Java 虚拟机。此方法从不正常返回。可以将变量作为一个状态码;根据惯例,非零的状态码表示非正常终止。
无线公话    虚拟机的关闭序列包含两个阶段。在第一个阶段中,会以某种未指定的顺序启动所有已注册的关闭钩子(hook)(如果有的话),并且允许它们同时运行直至结束。在第二个阶段中,如果已启用退出终结,则运行所有未调用的终结方法。一旦完成这个阶段,虚拟机就会暂停。
 
    如果在虚拟机已开始其关闭序列后才调用此方法,那么若正在运行关闭钩子,则将无限期地阻断此方法。如果已经运行完关闭钩子,并且已启用退出终结(on-exit finalization),那么此方法将利用给定的状态码(如果状态码是非零值)暂停虚拟机;否则将无限期地阻断虚拟机。
 
    it 方法是调用此方法的一种传统而便捷的方式。
 
    参数:
    status - 终止状态。按照惯例,非零的状态码表明非正常终止。
    抛出:
   SecurityException - 如果安全管理器存在,并且其checkExit 方法不允许存在指定的状态
    另请参见:
粉煤灰水泥
   SecurityException, SecurityManager.checkExit(int),addShutdownHook(java.lang.Thread), removeShutdownHook(java.lang.Thread),runFinalizersOnExit(boolean), halt(int) 
 
该方法又是调用Shutdown这个类的exit()方法。
 
    static voidexit(int status) {
    booleanrunMoreFinalizers = false;
    synchronized(lock) {
    if (status !=0) runFinalizersOnExit = false;
    switch (state){
    case RUNNING:/* Initiate shutdown */
    state = HOOKS;
    break;
    case HOOKS: /*Stall and halt */
    break;远程定向强声扩音系统
    caseFINALIZERS:
    if (status !=0) {
    /* Haltimmediately on nonzero status */
    halt(status);
    } else {
    /*Compatibility with old behavior:
    * Run morefinalizers and then halt
    */
   runMoreFinalizers = runFinalizersOnExit;
    }
    break;
    }
    }
    if(runMoreFinalizers) {
   runAllFinalizers();
    halt(status);
    }
    synchronized(Shutdown.class) {
    /* Synchronizeon the class object, causing any other thread
    * thatattempts to initiate shutdown to stall indefinitely
    */

本文发布于:2024-09-21 22:44:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/311169.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法   状态   关闭   退出   结束   调用
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议