1、介紹
Android的活動是可以層疊的,我們每啟動一個新的活動,就會覆蓋有原活動之上,點擊Back鍵之后會銷毀最上面的活動,下面的一個活動就會重新顯示出來。
2、 返回棧
Android使用(Task)來管理活動;
一個任務就是一組存放在棧里的的活動集合,這個棧也稱之為返回棧(back Stack);
棧是一種先進先出的數(shù)據(jù)結構;
工作流程:
在默認情況下,
每當啟動了一個新的活動,它會在返回棧中入棧,并處于棧頂?shù)奈恢茫?/p>
每當我們按下Back鍵或調(diào)用finish()方法去銷毀一個活動時,處于棧頂?shù)奈恢玫幕顒泳蜁鰲#@時前一個入棧的活動就會重新處于棧頂?shù)奈恢茫到y(tǒng)就會是顯示處于棧頂?shù)幕顒咏o用。
3、活動狀態(tài)(每個活動其生命周期最多可能會有4種狀態(tài))
3.1、運行狀態(tài)
當一個活動位于返回棧的棧頂時,活動就處于運行狀態(tài)。
3.2、暫停狀態(tài)
當一個活動不再處于棧頂位置,但仍然可見時,活動就進入了暫停狀態(tài)。
示例:并不是每一個活動都會占滿整個屏幕,比如對話框形式的活動就只會占用屏幕中間的部分區(qū)域,你仍然可以看到后面的活動;
處于暫停狀態(tài)的活動仍然是完全存活著的;
只有在內(nèi)存極低的情況下才會考慮回收這種活動;
3.3、停止狀態(tài)
當一個活動不再處于棧頂位置,并且完成不可見的時候,就進入了停止狀態(tài)。系統(tǒng)會為這種活動保存相應的狀態(tài)和成員變量(但是當其他地方需要內(nèi)存時,處于停止活動下的活動有可能會被系統(tǒng)回收。)
3.4、銷毀狀態(tài)
當一個活動從返回棧中移除后變成了銷毀狀態(tài)。系統(tǒng)會傾向回收這種狀態(tài)的活動,以保證手機內(nèi)存的充足。
4、活動的生存期
Activity中定義了7個回調(diào)方法,覆蓋了生命周期的每一個環(huán)節(jié);
onCreate()
每個活動基本都會重寫這個方法,它會在活動第一次創(chuàng)建的時候調(diào)用;這個方法會完成活動的初始化操作,比如:加載布局、綁定事件;
onStart()
這個方法在活動由不可見變?yōu)榭梢姷臅r候調(diào)用;
onResume()
這個方法在活動準備好和用戶進行交互的時候調(diào)用,此時的活動一定位于返回棧的棧頂,并且處于運行狀態(tài);
onPause()
這個方法在系統(tǒng)準備去啟動或者恢復另一個活動的時候調(diào)用;
(通常會在這個方法中將一)
onStop()
這個方法在活動完全不可見的時候調(diào)用;
onDestroy()
在活動被銷毀之前調(diào)用,之后活動的狀態(tài)變?yōu)殇N毀狀態(tài);
onRestart()
這個方法在活動由停止狀態(tài)變?yōu)檫\行狀態(tài)之前調(diào)用,就是活動被重新啟動的時候調(diào)用;
5、體驗活動的生命周期
準備工作
新建一個項目,允許自動創(chuàng)建活動和布局,并設置主活動;
再分別創(chuàng)建兩人子活動NormalActivity(布局命名:normal_layout)和DialogActivity(布局命名:dialog_layout);
normal_layout.xml 修改成內(nèi)容如下:
? ? ? ? ? ? ? android:orientation="vertical"
? ? ? ? ? ? ? android:layout_width="match_parent"
? ? ? ? ? ? ? android:layout_height="match_parent">
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:text="this is a mormal activity"
? ? ? ? />
dialog_layout.xml 修改成內(nèi)容如下:
? ? ? ? ? ? ? android:orientation="vertical"
? ? ? ? ? ? ? android:layout_width="match_parent"
? ? ? ? ? ? ? android:layout_height="match_parent"
? ? ? ? ? ? ? >
? ? ? ? android:layout_height="match_parent"
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:text="This is a dialog activity"
? ? ? ? />
修改注冊表AndroidManifest.xml如下:
? ? ? ? ? package="com.bignerdranch.android.activity_text">
? ? ? ? android:allowBackup="true"
? ? ? ? android:icon="@mipmap/ic_launcher"
? ? ? ? android:label="@string/app_name"
? ? ? ? android:roundIcon="@mipmap/ic_launcher_round"
? ? ? ? android:supportsRtl="true"
? ? ? ? android:theme="@style/AppTheme">
? ? ? ? ? ? android:theme="@andrid:style/Theme.Dialog">
添加兩個按鈕,一個用于啟動活動NormalActivity,一個用于啟動DialogActivity
主活動的布局如下:
? ? ? ? ? ? ? android:orientation="vertical"
? ? ? ? ? ? ? android:layout_width="match_parent"
? ? ? ? ? ? ? android:layout_height="match_parent">
? ? ? ? android:id="@+id/start_normal_activity"
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:text="Start normal activity"/>
? ? ? ? android:id="@+id/start_dialog_activity"
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:text="Start dialog activity"
? ? ? ? />
活動修改代碼如下:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
? ? public static final String TAG = "MainActivity";
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? Log.w(TAG,"onCreate");
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
? ? ? ? Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
? ? ? ? //設置按鈕的簽聽事件
? ? ? ? startNormalActivity.setOnClickListener(new View.OnClickListener(){
? ? ? ? ? ? public void onClick(View v){
? ? ? ? ? ? ? ? Intent intent = new Intent(MainActivity.this,NormalActivity.class);
? ? ? ? ? ? ? ? startActivity(intent);
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? //設置按鈕的簽聽事件
? ? ? ? startDialogActivity.setOnClickListener(new View.OnClickListener(){
? ? ? ? ? ? public void onClick(View v){
? ? ? ? ? ? ? ? Intent intent = new Intent(MainActivity.this,DialoActivity.class);
? ? ? ? ? ? ? ? startActivity(intent);
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? }
? ? protected void onStart(){
? ? ? ? super.onStart();
? ? ? ? Log.w(TAG,"onStart");
? ? }
? ? protected? void onResume(){
? ? ? ? super.onResume();
? ? ? ? Log.w(TAG,"Onresume");
? ? }
? ? protected? void onPause(){
? ? ? ? super.onPause();
? ? ? ? Log.w(TAG,"onpause");
? ? }
? ? protected? void onStop(){
? ? ? ? super.onStop();
? ? ? ? Log.w(TAG,"onstop");
? ? }
? ? protected void onDestroy(){
? ? ? ? super.onDestroy();
? ? ? ? Log.w(TAG,"onDestroy");
? ? }
? ? protected void onRestart(){
? ? ? ? super.onRestart();
? ? ? ? Log.w(TAG,"onRestart");
? ? }
}
進入時打印如下:
04-10 01:18:06.875 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動第一次創(chuàng)建的時候調(diào)用>> onCreate
04-10 01:18:06.908 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動由不可見變?yōu)榭梢姷臅r候調(diào)用>> onStart
04-10 01:18:06.911 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動準備好和用戶進行交互的時候調(diào)用>> Onresume
點擊START NOTMAL ACTIVITY 按鈕時會打印 如下:
04-10 01:18:27.265 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 系統(tǒng)準備去啟動或者恢復另一個活動的時候調(diào)用>> onpause
04-10 01:18:27.589 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動完全不可見的時候調(diào)用>> onstop
再點擊返回主活動頁面時打印 如下:
04-10 01:18:46.132 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動由停止狀態(tài)變?yōu)檫\行狀態(tài)之前調(diào)用>> onRestart
04-10 01:18:46.133 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動由不可見變?yōu)榭梢姷臅r候調(diào)用>> onStart
04-10 01:18:46.134 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動準備好和用戶進行交互的時候調(diào)用>> Onresume
點擊Start dialog activity 按鈕進打印如下:
04-10 17:22:18.739 3798-3798/com.bignerdranch.android.activity_text W/MainActivity: 系統(tǒng)準備去啟動或者恢復另一個活動的時候調(diào)用>> onpause
再點擊返回主活動頁面時打印 如下:
04-10 17:22:46.798 3798-3798/com.bignerdranch.android.activity_text W/MainActivity: 活動準備好和用戶進行交互的時候調(diào)用>> Onresume
再點擊返回退出app時打印
04-10 01:20:35.510 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 系統(tǒng)準備去啟動或者恢復另一個活動的時候調(diào)用>> onpause
04-10 01:20:36.031 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動完全不可見的時候調(diào)用>> onstop
? ? 活動被銷毀之前調(diào)用>> onDestroy
遇到的問題
在運行過程中點擊Start dialog activity 按鈕彈出框的時候,會發(fā)生閃退
分析出原因為類繼承的問題,修改方法如下;
修改DialoActivity.class中DialoActivity為繼承Activity類,代碼如下:
package com.bignerdranch.android.activity_text;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class DialoActivity extends Activity {
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.dialog_layout);
? ? }
}