您的位置:首页 > 移动开发 > Android开发

Activity最强生命周期

2016-10-14 14:00 197 查看
写在前面:

Googl官方的Android开发文档关于生命周期的描述给出了这么一张图片:



我对这张图片的解读是这样的:

Activity 类中定义的七个回调方法,覆盖了活动生命周期的每一个环节,下面我来一一

介绍下这七个方法。

1. onCreate()

这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动

第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。

2. onStart()

这个方法在活动由不可见变为可见的时候调用

3. onResume()

这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的

栈顶,并且处于运行状态。

4. onPause()

这个方法在系统准备去启动或者恢复另一个活动的时候调用。 我们通常会在这个方

法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度

一定要快,不然会影响到新的栈顶活动的使用。

5. onStop()

这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如

果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop()

方法并不会执行。

6. onDestroy()

这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

7. onRestart()

这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

以上七个方法中除了 onRestart()方法, 其他都是两两相对的,从而又可以将活动分为三种生存期。

1. 完整生存期

活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情

况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完

成释放内存的操作。

2. 可见生存期

活动在 onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存

期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两

个方法,合理地管理那些对用户可见的资源。比如在 onStart()方法中对资源进行加载,

而在 onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。

3. 前台生存期

活动在 onResume()方法和 onPause()方法之间所经历的,就是前台生存期。在前台

生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时

看到和接触最多的也这个状态下的活动。

1,单个Activity生命周期

一言不合直接上代码:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
protected void onStart() {
super.onStart();

System.out.println("one onStart");
}

@Override
protected void onStop() {
super.onStop();

System.out.println("one onStop");
}

@Override
protected void onDestroy() {
super.onDestroy();

System.out.println("one onDestroy");
}

@Override
protected void onPause() {
super.onPause();

System.out.println("one onPause");
}

@Override
protected void onResume() {
super.onResume();

System.out.println("one onResume");
}

@Override
protected void onRestart() {
super.onRestart();

System.out.println("one onReStart");
}
}


这里我直接重写了MainActivity的7个方法,这里简单起见,我给每个方法打印了一句话,每当Activity执行都某个方法时,打印出该方法的名字。

刚打开Activity打印是这样的:



一个Activity的创建,没什么可说的

点击home键回到桌面打印是这样的:



因为Activity已经变为不可见,所以执行这两个方法;又因为我并没有直接退出Activity,所以没有执行onDestroy方法

再次点击进入Activity:



这里我们不是重新创建一个Activity,所以不执行onCreate

点击返回键退回桌面:



Activity被销毁,执行onDestroy

2、在Activity跳转过程的生命周期

与第一种情况相比代码稍有改动;一脸懵逼,上代码:

给MainActivity增加一个Button用于跳转到ActivityTwo:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i =  new Intent(MainActivity.this,ActivityTwo.class);
startActivity(i);
}
});

System.out.println("one onCreate");
}


ActivityTwo代码<
bd0c
/p>

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class ActivityTwo extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
}

@Override
protected void onStart() {
super.onStart();

System.out.println("two onStart");
}

@Override
protected void onStop() {
super.onStop();

System.out.println("two onStop");
}

@Override
protected void onDestroy() {
super.onDestroy();

System.out.println("two onDestroy");
}

@Override
protected void onPause() {
super.onPause();

System.out.println("two onPause");
}

@Override
protected void onResume() {
super.onResume();

System.out.println("two onResume");
}

@Override
protected void onRestart() {
super.onRestart();

System.out.println("two onReStart");
}
}


点击按钮,打印如下:





启动一个全屏显示的ActivityTwo,前面的MainActivity肯定是要Stopped,但是这个调用的顺序一定要注意。它是先onPause,然后等ActivityTwo执行完onResume方法后,再执行onStop方法。这也是为什么强调在onPause方法里面,我们只能去执行一些轻量级的代码。

现在ActivityTwo处于前台,并且用户可见,现在点击返回按钮,打印如下:





按下返回按钮,等于finish掉了ActivityTwo,看它的执行过程,也是先暂停自身,然后再去重启MainActivity,等MainActivity重启完毕后,再调用onStop和onDestory方法。

3、启动对话框样式的ActivityTwo

在Androidmanifest文件把ActivityTwo设置为对话框样式的Activity:

<activity android:name=".ActivityTwo"
android:theme="@android:style/Theme.Dialog"></activity>


点击按钮,启动对话框式的ActivityTwo:



启动ActivityTwo后,MainActivity还可见,只是不可与用户交互;所以不执行onStop方法

现在ActivitTwoy处于前台,而且可以与用户交互,现在点击返回按钮,打印如下:





可以看到MainActivity调用的是onResume方法

四、回调方法应该干些甚么

回调方法的作用,就是通知我们Activity生命周期的改变,然后我们可以处理这种改变,以便程序不会崩溃或者数据丢失等等,也就是拥有更好的用户体检,那么这么多回调方法里到底应该怎么做呢?

这个问题不好总结,因为不同的应用、不同的Activity所干的事都不一样,有时候我们甚至只需要实现一个onCreate就行了。所以下面所说的,看看即可,不一定符合所有的情况。

1、onCreate

最重要是在里面调用setContentView,还可以在里面初始化各控件、设置监听、并初始化一些全局的变量。

因为在Activity的一次生命周期中,onCreate方法只会执行一次。在Paused和Stopped状态下恢复或重启的下,这些控件、监听和全局变量也不会丢失。即便是内存不足,被回收了,再次Recreate的话,又是一次新的生命周期的开始,又会执行onCreate方法。

还可以在onCreate执行数据操作,比如从Cursor中检索数据等等,但是如果你每次进入这个Activity都可能需要更新数据,那么最好放在onStart里面。(这个需要根据实际情况来确定)

2、onDestory

确定某些资源是否没有被释放,做一些最终的清理工作,比如在这个Activity的onCreate中开启的某个线程,那么就要在onDestory中确定它是否结束了,如果没有,就结束它。

3、onStart和onRestart、onStop

Activity进入到Stopped状态之后,它极有可能被系统所回收,在某些极端情况下,系统可能是直接杀死应用程序的进程,而不是调用onDestory方法,所以我们需要在onStop方法中尽可能的释放那些用户暂时不需要使用的资源,防止内存泄露。

尽管onPause在onStop之前执行,但是onPause只适合做一些轻量级的操作,更多的耗时耗资源的操作还是要放在onStop里面,比如说对数据保存,需要用到的数据库操作。

因为从Stopped状态重启之后, onStart和onRestart方法都会被执行,所以我们要判断哪些操作分别要放在哪个方法里面 。因为可能在onStop方法里面释放了一些资源,那么我们必须要重启他们,这个时候这些重启的操作放在onStart方法里面就比较好(因为onCreate之后也需要开启这些资源)。那些因为Stopped之后引发的需要单独操作的代码,就可以放在onRestart里面。

4、onResume和onPause

onPause和onResume中做的操作,其实意义上和onStart和inStop差不多,只不过是要更轻量级的,因为onPause不能阻塞转变到下一个Activity。

比如:停止动画、取消broadcast receivers。当然相应的需要在onResume中重启或初始化等等。

有时候也需要在onPause判断用户是调用finish结束这个Activity,还是暂时离开,以便区分处理。这时候可以调用isFinishing()方法来判断。如果是用户finish这个Activity,那么返回为true,如果只是暂时离开或者被系统回收的话,就返回false。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Activity