今天和大家討論一下Android中Activity的生命周期岂膳,雖然網(wǎng)上有很多文章都有介紹岖沛,但是大多解釋的不是很詳盡钠怯,所以這里我和大家一起總結(jié)一下這個(gè)知識(shí)點(diǎn)玻驻。首先我們先看一下Activity的生命周期圖。
Activity中有onCreate(),onStart(),onRestart()onResume(),onPause(),onStop()和onDestory()七個(gè)方法摊聋。下面我們依次介紹這些方法合適被調(diào)用:
(1) onCreate():Activity被創(chuàng)建時(shí)會(huì)被調(diào)用鸡捐,用于設(shè)置全局狀態(tài)。
(2)onStart():Activity被顯示出來(lái)的時(shí)候調(diào)用onStart(),但此時(shí)Activity不能與用戶交互麻裁。
(3)onRestart():從onStop()狀態(tài)到onStart()狀態(tài)變化時(shí)執(zhí)行箍镜,即Activity恢復(fù)可視狀態(tài)源祈。
(4)onResume():當(dāng)Acitvity被聚焦時(shí),執(zhí)行onRestart()色迂,用戶可以與Activity進(jìn)行交互香缺。
(5)onPause():當(dāng)Activity被另一個(gè)透明或者Dialog樣式的Activity覆蓋時(shí)執(zhí)行該方法,此時(shí)Activity仍然可見(jiàn)脚草,但是已經(jīng)失去聚焦赫悄,不能與用戶進(jìn)行聚焦。
(6)onStop():當(dāng)Activity不可見(jiàn)時(shí)馏慨,Activity處于Stopped狀態(tài)。
(7)onDestorry():Activity結(jié)束時(shí)銷毀線程姑隅,釋放資源等写隶。
下面我們用一個(gè)demo來(lái)進(jìn)一步解釋Activity的生命周期,demo的源碼和布局文件如下:
MainActivity.java
package linuszhao.js.one.jsactivitydemo;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private static String TAG = "linus";
private Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "start onCreate............");
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new AlertDialog.Builder(MainActivity.this).setTitle("一個(gè)彈框").show();
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG, "start onSaveInstanceState............");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "start onStart............");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "start onResume............");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "start onPause............");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "start onStop............");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "start onDestroy............");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "start onRestart............");
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="linuszhao.js.one.jsactivitydemo.MainActivity">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="Welcome my wrold!"
android:textSize="20sp" />
<EditText
android:id="@+id/etstring"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_below="@+id/tv1"
android:textSize="20sp" />
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/etstring"
android:text="彈出dialog"
android:textSize="20sp" />
</RelativeLayout>
(1)打開(kāi)應(yīng)用時(shí)先后執(zhí)行了onCreate()->onStart()->onResume三個(gè)方法讲仰,看一下LogCat視窗如下:
(2)當(dāng)我們按BACK鍵時(shí)慕趴,我們這個(gè)應(yīng)用程序?qū)⒔Y(jié)束,這時(shí)候我們將先后調(diào)用onPause()->onStop()->onDestory()三個(gè)方法鄙陡,如下圖所示:
(3)當(dāng)我們按HOME的時(shí)候冕房,Activity先后執(zhí)行了onPause()->onStop()這兩個(gè)方法,這時(shí)候應(yīng)用程序并沒(méi)有銷毀趁矾。如下圖所示:
(4)當(dāng)再次啟動(dòng)應(yīng)用程序時(shí)耙册,則先后分別執(zhí)行了onRestart()->onStart()->onResume()三個(gè)方法,如下圖所示:
(5)當(dāng)點(diǎn)擊button按鈕毫捣,彈出對(duì)話框時(shí)详拙,并會(huì)執(zhí)行onPause(),這是因?yàn)閐ialog是Activity的一部分,所以Activity的狀態(tài)不會(huì)變化蔓同。若由其他Activity彈出的dialog導(dǎo)致Acitivity失去聚焦饶辙,則會(huì)執(zhí)行onPause()。