Activity生命周期實(shí)例講解
Activity中有7個(gè)與生命周期有關(guān)的函數(shù)。其中onCreated()是activity第一次被啟動(dòng)時(shí)執(zhí)行的,主要是初始化一些變量,onRestart()是當(dāng)前activity重新被啟動(dòng)時(shí)調(diào)用的;綁定一些監(jiān)聽(tīng)器等;onStart()是activity界面被顯示出來(lái)的時(shí)候執(zhí)行的;onResume()是當(dāng)該activity與用戶(hù)能進(jìn)行交互時(shí)被執(zhí)行;onPause()是另一個(gè)activity被啟動(dòng),當(dāng)前的activity就被暫停了,一般在該函數(shù)中執(zhí)行保存當(dāng)前的數(shù)據(jù);onStop()表示另一個(gè)activity被啟動(dòng)完成時(shí),當(dāng)前activity對(duì)用戶(hù)同時(shí)又完全不可見(jiàn)時(shí)才調(diào)用的;onDestroy()是退出當(dāng)前activity時(shí)調(diào)用的,當(dāng)然如果程序中調(diào)用finish()或者說(shuō)android系統(tǒng)當(dāng)前資源不夠用時(shí)就會(huì)被調(diào)用。
當(dāng)用多個(gè)activity在執(zhí)行時(shí),這時(shí)候android系統(tǒng)會(huì)自動(dòng)將這些activity壓入棧中并且總是顯示最頂?shù)哪莻€(gè)activity,這個(gè)棧在android叫做task,但是這個(gè)棧只支持壓入和彈出操作,不支持排序插入等操作。
Activity的7個(gè)生命周期函數(shù)中的onStop()函數(shù)被調(diào)用時(shí)是在其對(duì)應(yīng)的activity被另外的activity完全遮擋的時(shí)候,如果只有部分遮擋,則不會(huì)被調(diào)用。部分遮擋一般是以消息activtiy的形式出現(xiàn),這個(gè)只需在AndroidManifest.xml中將其對(duì)于的activity的主題設(shè)置theme中更改即可。
這7個(gè)周期函數(shù),當(dāng)系統(tǒng)資源不夠時(shí),其中onPause(),onStop(),onDestroy()是有可能被系統(tǒng)kill掉的,但其它4個(gè)是不會(huì)被kill掉。
參考資料為mars老師的資料。
官方給出關(guān)于這7個(gè)生命周期的圖如下:
下面這個(gè)實(shí)驗(yàn)是有2個(gè)activity,第1個(gè)activity中有一個(gè)按鈕調(diào)用第2個(gè)activity,并且每個(gè)activity都重寫(xiě)了這7個(gè)生命周期函數(shù),每個(gè)生命周期中打印出一條語(yǔ)句,以表示是是哪個(gè)activity在執(zhí)行哪個(gè)生命周期函數(shù)。
實(shí)驗(yàn)過(guò)程當(dāng)顯示出了第1個(gè)activity后,單擊Next Activity!按鈕,這是會(huì)顯示第2個(gè)activity,然后又按系統(tǒng)的返回鍵,返回第1個(gè)界面。
這時(shí)候打印出來(lái)的結(jié)果如下圖所示:
由此可見(jiàn),一開(kāi)始程序運(yùn)行時(shí)是首先調(diào)用第1個(gè)activity的onCreate(),onStart(),onResume()函數(shù),然后按下button后,調(diào)用第1個(gè)activity的onPause(),和第2個(gè)activity的onCreate(),onStart(),onResume()函數(shù),然后接著調(diào)用第1個(gè)activity的onStop(),當(dāng)按下系統(tǒng)返回鍵時(shí),這時(shí)會(huì)調(diào)用第2個(gè)activity的onPause(),接著是第1個(gè)activity的onRestart(),onStart(),onResume(), 最后是調(diào)用第2個(gè)的onStop()和onDestroy().
界面1如下所示:
MainActivity.java:
package com.example.lifeone;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.next_activity);
btn.setText(R.string.next_activity);
System.out.println("first activity: onCreate()");
btn.setOnClickListener(new MyNextActivity());
}
@Override
protected void onDestroy() {
System.out.println("first activity: onDestroy()");
super.onDestroy();
}
@Override
protected void onPause() {
System.out.println("first activity: onPause()");
super.onPause();
}
@Override
protected void onRestart() {
System.out.println("first activity: onRestart()");
super.onRestart();
}
@Override
protected void onResume() {
System.out.println("first activity: onResume()");
super.onResume();
}
@Override
protected void onStart() {
System.out.println("first activity: onStart()");
super.onStart();
}
@Override
protected void onStop() {
System.out.println("first activity: onStop()");
super.onStop();
}
class MyNextActivity implements OnClickListener
{
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
MainActivity.this.startActivity(intent);
}
}
}
SecondActivity.java:
package com.example.lifeone;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class SecondActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
System.out.println("second activity:onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
@Override
protected void onDestroy() {
System.out.println("second activity: onDestroy()");
super.onDestroy();
}
@Override
protected void onPause() {
System.out.println("second activity: onPause()");
super.onPause();
}
@Override
protected void onRestart() {
System.out.println("second activity: onRestart()");
super.onRestart();
}
@Override
protected void onResume() {
System.out.println("second activity: onResume()");
super.onResume();
}
@Override
protected void onStart() {
System.out.println("second activity: onStart()");
super.onStart();
}
@Override
protected void onStop() {
System.out.println("second activity: onStop()");
super.onStop();
}
}
相關(guān)文章
android 仿微信demo——微信消息界面實(shí)現(xiàn)(服務(wù)端)
本系列文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你們提供幫助2021-06-06Android實(shí)現(xiàn)頁(yè)面翻轉(zhuǎn)和自動(dòng)翻轉(zhuǎn)功能
這篇文章主要介紹了Android中簡(jiǎn)單實(shí)現(xiàn)頁(yè)面翻轉(zhuǎn)和自動(dòng)翻轉(zhuǎn)的功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Android源碼學(xué)習(xí)之工廠方法模式應(yīng)用及優(yōu)勢(shì)介紹
工廠方法模式定義:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。工廠方法使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi),感興趣的朋友可以了解下哦2013-01-01Android圖片三級(jí)緩存的原理及其實(shí)現(xiàn)
本篇文章主要介紹了Android圖片三級(jí)緩存的原理及其實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09深入剖析Android的Volley庫(kù)中的圖片加載功能
這篇文章主要介紹了Android的Volley框架中的圖片加載功能,從源碼剖析了Volley加載圖片時(shí)的請(qǐng)求隊(duì)列處理等方面,需要的朋友可以參考下2016-04-04實(shí)例講解Android Fragment的兩種使用方法
今天小編就為大家分享一篇關(guān)于實(shí)例講解Android Fragment的兩種使用方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Android編程之在SD卡上進(jìn)行文件讀寫(xiě)操作實(shí)例詳解
這篇文章主要介紹了Android編程之在SD卡上進(jìn)行文件讀寫(xiě)操作的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android的文件操作及針對(duì)SD卡的存取操作相關(guān)技巧,需要的朋友可以參考下2015-12-12Android中自定義ContentProvider實(shí)例
應(yīng)用A(TestBaidu)調(diào)用另外一個(gè)應(yīng)用(TestContentProvider)中的自定義ContentProvider,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06