今天我要介绍一下Activity生命周期,谈到Activity生命周期我们都会想到经典Activity生命周期图如下:
在这里我不想做过多的解释这张生命周期图,在这张图中我们可以注意到:onCreate、onStart、onResume、onPause、onstop、onDestory、onRestart这7个方法。下面我就用自己写的一个Demo来说明这张Activity的生命周期。再此我们还需要2个方法:onSaveInstanceState、onRestoreInstanceState,这两个方法是我们保存数据需要用到的2个关键重要方法。
好!我们现在开始完成我们的Demo......
1、我们新建一个ActivityDemo工程如下:
2、我们在activity_home.xml中设置代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lgy.activitydemo.HomeActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/hello_world" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/editText1"
android:text="跳转到Activity B中去" />
</RelativeLayout>
3、我们在HomeActivity中设置代码:
package com.lgy.activitydemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
public class HomeActivity extends Activity {
private static final String TAG = "HomeActivity";
private EditText editText;
private String saveStr;
private Button btn;
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.i(TAG, "HomeActivity~onSaveInstanceState");
outState.putString("saveStr", saveStr);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i(TAG, "HomeActivity~onCreate~(onRestoreInstanceState)");
saveStr = savedInstanceState.getString("saveStr", "");
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
if(null == savedInstanceState){
Log.i(TAG, "HomeActivity~onCreate~(null == savedInstanceState)");
}else{
Log.i(TAG, "HomeActivity~onCreate~(null != savedInstanceState)");
saveStr = savedInstanceState.getString("saveStr", "");
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Log.i(TAG, "HomeActivity~onCreate");
editText = (EditText) findViewById(R.id.editText1);
editText.setText(saveStr);
btn = (Button) findViewById(R.id.button1);
}
@Override
protected void onStart() {
Log.i(TAG, "HomeActivity~onStart");
super.onStart();
}
@Override
protected void onResume() {
Log.i(TAG, "HomeActivity~onResume");
super.onResume();
}
@Override
protected void onPause() {
Log.i(TAG, "HomeActivity~onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.i(TAG, "HomeActivity~onStop");
super.onStop();
}
@Override
protected void onDestroy() {
Log.i(TAG, "HomeActivity~onDestroy");
super.onDestroy();
}
@Override
protected void onRestart() {
Log.i(TAG, "HomeActivity~onRestart");
super.onRestart();
}
}
代码示例我们先写到这里,那么我们现在开始运行测试的界面如下:
运行到这里我们可以看看logcat日志中的信息:
从而我们可以知道Activity的一开始生命周期顺序:onCreate-->onStart-->onResume。
点击硬件设备“返回”
从图片中我可以看出生命周期:onCreate-->onStart-->onResume-->onPause-->onStop-->onDestroy。
点击硬件设备“Home”
从图片中我们可以看出生命周期:onCreate-->onStart-->onResume-->onPause-->onSaveInstanceState-->onStop,我们可知道点击home键的时候,当前可见视图Activity调用onPause暂停,保存数据调用onSaveInstanceState方法,最后调用onStop方法。我们可以看到并没有调用onDestory方法,也就是说我们的应用程序Activity并没有被销毁。
点击硬件设备“Home”之后我们在点击应用程序图标
从图片中我们可以看出生命周期:onCreate-->onStart-->onResume-->onPause-->onSaveInstanceState-->onStop-->onRestart-->onStart-->onResume。在这里我们可以知道点击Home键之后在点击应用图标进入程序的话,程序并不会再次调用onCreate等方法,原因在于此Activity还没有被销毁。程序选择调用onRestart方法到onStart方法。
从而我们可以知道在程序失去与用户交互的时候,系统会帮我们调用onSaveInstanceState方法保存数据信息状态,从而保证了我们程序再次进入的时候,原来数据信息状态的完整正确性。
好了,下面我们继续编写我们的代码
4、我们在HomeActivity程序中加入按钮“跳转到Activity B中去”事件代码:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent mIntent = new Intent(HomeActivity.this, BActivity.class);
mIntent.putExtra("edtext", editText.getText().toString());
startActivity(mIntent);
}
});
5、我们编写BActivity.java程序代码:
package com.lgy.activitydemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
public class BActivity extends Activity{
private static final String TAG = "BActivity";
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
Log.i(TAG, "BActivity~onCreate");
btn = (Button) findViewById(R.id.button1);
/*btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});*/
}
@Override
protected void onStart() {
Log.i(TAG, "BActivity~onStart");
super.onStart();
}
@Override
protected void onResume() {
Log.i(TAG, "BActivity~onResume");
super.onResume();
}
@Override
protected void onPause() {
Log.i(TAG, "BActivity~onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.i(TAG, "BActivity~onStop");
super.onStop();
}
@Override
protected void onDestroy() {
Log.i(TAG, "BActivity~onDestroy");
super.onDestroy();
}
@Override
protected void onRestart() {
Log.i(TAG, "BActivity~onRestart");
super.onRestart();
}
}
6、我们编写activity_b.xml的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="B Activity"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回" />
</LinearLayout>
好,那么现在我们点击按钮进入到ActivityB中去,logcat日志将会显示:
从图中我们可以发现从HomeActivity中进入BActivity之后,HomeActivity和BActivity的生命周期:先HomeActivity正常运行调用onCreate-->onStart-->onResume-->onCreate,到这个时候开启ActivityB的生命周期onCreate-->onStart-->onResume,等到BActivity正常运行之后在调用HomeActivity保存数据onSaveInstanceState方法最后停止运行调用onStop方法,但是这个时候onDestory方法并没有执行也就是说明HomeActivity并没有被销毁。
此时点击硬件设备“返回”
从图中我们可以看点击硬件设备的返回按钮之后,先调用ActivityB的onPause方法,再调用HomeActivity的onRestart-->onStart-->onResume方法,当HomeActivity运行正常之后在调用ActivityB的onStop-->onDestory方法,这个时候ActivityB调用了onDestory方法,说明了ActivityB的生命周期已经结束。
此时点击硬件设备“Home”
从图中我们可以观察得知:当前可视化视图B调用onPause-->onStop方法。
此时我们再次进入到程序中,logcat日志如下:
从图中我们可以得知再次进入程序的时候,会调用BActivity的onRestart-->onStart-->onResume方法。
我们启用“返回”按钮,logcat日志如下:从图中我们可以得知此时的情况是和点击硬件设备上的返回按钮作用一样。
我们在AndroidManifest.xml文件中将BActivity样式设置为Dialog样式或者Translucent透明样式,那么我们再次进入ActivityB的话,logcat日志显示如下:
从日志图片中我们可以观察到Activity的样式改变之后,生命周期HomeActivity并没有调用onStop方法,原因就是在于此时HomeActivity视图用户仍然处于可见状态,只是失去了与用户交互的焦点。
我们此时若要点击硬件“返回”或者返回按钮的话,logcat日志显示如下:
从日志图片中我们可以观察到此时只是调用了HomeActivity的onResume方法,并没有走onRestart等方法。
我们此时若要点击硬件“Home“话,logcat日志显示如下:
从日志图片中我们可以观察到此时调用ActivityB的onPause-->onStop方法,HomeActivity调用了onStop方法。
我们此时接着进入程序的话,logcat日志显示如下:
此时我们观察到HomeActivity先调用onRestart-->onStart方法,BActivity调用onRestart-->onStart方法,最后调用onResume方法。
综合以上情况:
1、在内存充足的情况下,从ActivityA跳到ActivityB,调用顺序就是ActivityA先调用onPause方法暂停-->ActivityB的生命周期创建正常运行后-->ActivityA的数据保存以及是否调用onStop方法。
2、在内存充足的情况下,从ActivityA跳到ActivityB,此时可以与用户交互的只有ActivityB,决定ActivityA是否调用onStop方法的关键就是:ActivityA是否此时可见(换种说法就是ActivityB是否全透明样式或者dialog样式,这样ActivityA就会有部分可见)。从而也决定了ActivityA的恢复状态时的调用顺序:第一:ActivityA可见onPause,恢复的时候调用onResume;第二:ActivityA不可见onStop,恢复的时候调用onRestart-->OnStart-->onResume;
3、从以上图片中我们可以得知:在调用了onPause方法之后绝对会调用onSaveInstanceState方法,来保存数据信息状态。
4、在内存不足的情况下,Activity都有可能被系统回收,至于怎么回收,这就取决于当前生命周期优先级和状态。不管怎么样,一旦被回收的话,再次进入的话,系统会再次重新启动生命周期。
写到这里,我想Activity的生命周期应该就差不多了,现在再回头看看经典Activity生命周期图,是不是很好理解。
好了,就写到这里了! 如果问题的话,可以留言我们一起探讨讨论哦!谢谢。。。。。。