一抬手一动脚的能源并从未被清理,把具有的Activity 都 finish了

正文转自:http://blog.csdn.net/zeus_9i/article/details/7259881

风流浪漫、生命周期7个

onCreate
onStart
onResume
** onPause**
** onStop**
** onDestory**
** onRestart**

  • onCreate是最初化职业

  • onCreate和onDestory是生机勃勃对。onStart和onStop是局地,调控是不是可以看到。

  • onResume和onPause是有个别,调控是还是不是可交互。举个例子新对话框B假若完全挡住A,则A会施行onPause,onStop。假诺只是黄金年代对遮挡,则只进行onPause。

  • 澳门永利,onRestart,比方新开荒的B被关闭了,又重新归来。onRestart会重临到onStart继续往下,并不会进行onCreate

  • onPause不能够做太复杂的操作,原因如下
    <pre>
    A.onCreate
    A.onStart
    A.onResume
    A.onPause//打开全遮挡的B
    B.onCreate
    B.onStart
    B.onResume
    A.onStop
    </pre>

可知耗费时间过长,会潜濡默化B的张开

   前段时间两日为理解决Android上边退出程序难题折腾了半死,在google & baidu
上面找了非常久、相当久出来的一丝一毫千篇风度翩翩律,说的不二秘诀有三,不过通过小编试验后生机勃勃切老大。

二、参考Android Activity类中的finish()、onDestory()和System.exit(0) 三者的分裂

finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将移步推向后台,并不曾应声释放内部存款和储蓄器,活动的能源并从未被清理;当调用System.exit(0)时,杀死了百分百进度,那时候活动所占的财富也会被假释。

  • Activity.finish()
    Call this when your activity is done and should be closed.
    在您的activity动作产生的时候,可能Activity须要关闭的时候,调用此方法。
    当您调用此办法的时候,系统只是将最上边的Activity移出了栈,并不曾立刻的调用onDestory()方法,其占用的财富也未曾被立时放出。因为移出了栈,所以当您点击掌提式无线电话机方面包车型客车“back”开关的时候,也不会找到那一个Activity。

  • Activity.onDestory()
    the system is temporarily destroying this instance of the activity
    to save space.系统销毁了那些Activity的实例在内部存储器中据有的空中。
    在Activity的生命周期中,onDestory()方法是他生命的最后一步,财富空间怎样的都未曾咯~~。当再次步向此Activity的时候,必需重新创立,试行onCreate()方法。

  • System.exit(0)
    这个人是退出整个应用程序的,是针对全数Application的。将所有经过从来KO掉。使用时,能够写在onDestory()方法内,亦可向来在想淡出的地点向来调用:
    System.exit(0);
    或 android.os.Process.killProcess(android.os.Process.myPid());

      四个措施分别是:

 

  1. killProcess, 这种情势当您kill后 Activity 会再次来到到上两个Activity
  2. Android Level
    8(包罗8)前应用一个API来操作,Level8今后又是其余风姿浪漫种,所以不能够通用
  3. 使用 FLAG_ACTIVITY_CLEAR_TOP,从 A 到 B

上面介绍自身的法子:

大家都知道 Android 的 Activity
是存着历史栈的,比方从 A -> B -> C,C 达成 finish 后归来
B,把装有的Activity 都 finish了,程序就自然退出了。 当然在 finish
的还要也需倘诺否友善程序的别样财富。所以须求想个办法把 Activity
给存起来。然后在前后相继退出的地点调用它们的 finish()方法。

 

采用全局变量。对了,第3个想到的就是持续
Application,代码入下。

 

public class AgentApplication extends Application {

private List<Activity> activities = new ArrayList<Activity>();

    public void addActivity(Activity activity) {
        activities.add(activity);
    }

    @Override
    public void onTerminate() {
        super.onTerminate();

        for (Activity activity : activities) {
            activity.finish();
        }

        onDestroy();

        System.exit(0);
    }
}

下一场在 Activity  onCreate 的时候来调用
 addActivity (),有人或者想到那个Application须要在具有的 Activity
 onCreate的时候都选择,需求做贰个单例实例。其实历来无需。在 Activity
中应用  this.getApplication() 就足以了。

 

最后在您必要生产程序的地方调用
application.onTerminate() 就能够了。记住:super.onTerminate()
必得调用,代码中的
onDestroy()是本人要好的获释别的能源的点子,不是系统的。

 

运作以上代码后,在LogCat
中会出现后生可畏行提醒:

Process  包名 (pid  xxxxx)  has died.
 注解您的次第退出了。以后您能够测量试验了。

 

可望对大家有用。同临时候感激同事李佳伦帮自己管理其余主题素材,使得笔者才不时光来
写博客,感激

 

相关文章