Android的activity
文章目錄
- Android的activity
- 前言
- 一、Activity是什么?
- 二、活動的基本用法
- 1.手動創建活動
- 2.創建和加載布局
- 3.在AndroidManifest檔案中注冊
- 4.在活動中使用Toast
- 5.在活動中使用Menu
- 6.銷毀一個活動
- 三、活動的生命周期
- 1.回傳堆疊
- 2.活動狀態
- 2.1 運行狀態
- 2.2 暫停狀態
- 2.3 停止狀態
- 2.4 銷毀狀態
- 活動的生存期
- 1. onCreate()
- 2. onStart()
- 3. onResume()
- 4. onPause()
- 5. onStop()
- 6. onDestroy()
- 7. onRestart()
- 1. 完整生存期
- 2. 可見生存期
- 3. 前臺生存期
- 生命周期示意圖:
- 四、活動的啟動模式
- 1.standard 模式
- 1.1模式示意圖:
- 1.2FirstActivity的代碼
- 1.3APP效果的視頻演示
- 2.singleTop 模式
- 2.1模式示意圖:
- 2.2ActivityManifest.xml的代碼
- 2.3FirstActivity的代碼
- 2.4SecondActivity的代碼
- 2.5APP效果的視頻演示
- 3.singleTask 模式
- 3.1模式示意圖:
- 3.2ActivityManifest.xml的代碼
- 3.3FirstActivity的代碼
- 3.4SecondActivity的代碼
- 3.5APP效果的視頻演示
- 4.singleInstance 模式
- 4.1模式示意圖:
- 4.2ActivityManifest.xml的代碼
- 4.3FirstActivity的代碼
- 4.4SecondActivity的代碼
- 4.5ThirdActivity的代碼
- 4.6APP效果的視頻演示
- 總結
前言
前面我們已經學習,Android開發的專案結構、Android開發的幾個常用控制元件以及Android開發的四個基本布局,好了,接下來,我們來講講activisty,概念比較多,理解就好,

一、Activity是什么?
度娘是這樣說的,Activity是最基本的模塊,一般稱之為“活動”,在應用程式中,一個Activity通常就是一個單獨的螢屏,簡單理解,Activity代表一個用戶所能看到的螢屏,主要用于處理應用程式的整體性作業,例如監聽系統事件,為用戶顯示指定的View,啟動其他Activity等,所有應用的Activity都繼承于android.app.Activity類,該類是Android提供的基層類,其他的Activity繼承該父類后,通過父類的方法來實作各種功能,
其實簡單來講,一個 Activity 包含了用戶能夠看到的界面,從而于用戶進行互動,一個應用程式中可以有零個或者多個Activity,零個 Activity 就表示,這個應用程式不包含與用戶互動的界面,
二、活動的基本用法
這個我們暫時不細講,后面一期我會單獨講,你們懂得,一次性講清楚太累了,哈哈哈,
主要是下面幾個操作:
1.手動創建活動
2.創建和加載布局
3.在AndroidManifest檔案中注冊
4.在活動中使用Toast
5.在活動中使用Menu
6.銷毀一個活動
三、活動的生命周期
1.回傳堆疊
下圖為回傳堆疊作業示意圖

Android 使用任務(Task)來管理活動,一個任務就是一組存放在堆疊里的活動的集合,后進先出,這個堆疊也被稱為回傳堆疊,
2.活動狀態
每個活動在其生命周期中最多可能會有四種狀態,
2.1 運行狀態
當一個活動位于回傳堆疊的堆疊頂時,這時活動就處于運行狀態,
2.2 暫停狀態
當一個活動不再處于堆疊頂位置,但仍然可見時,這時活動就進入了暫停狀態,
2.3 停止狀態
當一個活動不再處于堆疊頂位置,并且完全不可見的時候,就進入了停止狀態,
2.4 銷毀狀態
當一個活動從回傳堆疊中移除后就變成了銷毀狀態,
活動的生存期
Activity 類中定義了七個回呼方法,覆寫了活動生命周期的每一個環節,
1. onCreate()
它會在活動第一次被創建的時候呼叫,
2. onStart()
這個方法在活動由不可見變為可見的時候呼叫,
3. onResume()
這個方法在活動準備好和用戶進行互動的時候呼叫,
4. onPause()
這個方法在系統準備去啟動或者恢復另一個活動的時候呼叫,
5. onStop()
這個方法在活動完全不可見的時候呼叫,
6. onDestroy()
這個方法在活動被銷毀之前呼叫,之后活動的狀態將變為銷毀狀態,
7. onRestart()
這個方法在活動由停止狀態變為運行狀態之前呼叫,也就是活動被重新啟動了,
以上七個方法中除了onRestart()方法,其他都是兩兩相對的,從而又可以將活動分為三種生存期,
1. 完整生存期
活動在 onCreate() 方法和 onDestroy() 方法之間所經歷的,就是完整生存期,一般情況下,一個活動會在 onCreate() 方法中完成各種初始化操作,而在 onDestroy() 方法中完成釋放記憶體的操作,
2. 可見生存期
活動在 onStart() 方法和 onStop() 方法之間所經歷的,就是可見生存期,在可見生存期內,活動對于用戶總是可見的,即便有可能無法和用戶進行互動,我們可以通過這兩個方法,合理地管理那些對用戶可見的資源,比如在 onStart() 方法中對資源進行加載,而在 onStop() 方法中對資源進行釋放,從而保證處于停止狀態的活動不會占用過多記憶體,
3. 前臺生存期
活動在 onResume() 方法和 onPause() 方法之間所經歷的,就是前臺生存期,在前臺生存期內,活動總是處于運行狀態的,此時的活動是可以和用戶進行相互的,我們平時看到和接觸最多的也這個狀態下的活動,
生命周期示意圖:

四、活動的啟動模式
啟動模式一共有 4 中:standard、singleTop、singTask 和 singleInstance,可以在 AndroidManifest.xml 中通過 標簽指定 android:launchMode 屬性來選擇啟動模式,
1.standard 模式
standard 模式是 Activity 的默認啟動模式,在不進行顯示指定的情況下,所有 Activity 都會自動使用這種啟動模式,這種模式下,每當啟動一個新的 Activity,它就會在回傳堆疊的堆疊頂位置,對于使用 standard 模式啟動的 Activity,系統不會在乎這個 Activity 是否已經存在在堆疊中了,每次啟動的時候都會創建一個新的實體,
誰啟用了這個模式的 Activity,那么這個 Activity 就屬于啟動它的 Activity 的任務堆疊,
1.1模式示意圖:

1.2FirstActivity的代碼
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState);
setContentView(R.layout.first_layout);
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//顯式Intent
Intent intent=new Intent(FirstActivity.this,FirstActivity.class);
//構建一個intent,傳入FirstActivity.this作為背景關系,傳入FirstActivity.class作為目標活動
startActivity(intent);//接受intent引數,啟動活動
}
});}
1.3APP效果的視頻演示
[video(video-Fgit7o6S-1617798347230)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=629885115)(image-https://ss.csdn.net/p?http://i0.hdslb.com/bfs/archive/57192cd9d1c4056395c1e7586dabfe7bbf6dda2e.jpg)(title-standard 模式演示)]
2.singleTop 模式
如果 Activity 指定為 singleTop,在啟動 Activity 的時候發現回傳堆疊的堆疊頂已經是該 Activity 了,則認為可以直接使用它,就不會再創建新的 Activity 實體了,
因為不會創建新的 Activity 實體,所以 Activity 的生命周期就沒有什么變化了,但是它的 onNewIntent 方法會被呼叫,
2.1模式示意圖:

2.2ActivityManifest.xml的代碼
<activity android:name=".FirstActivity"
android:launchMode="singleTop"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2.3FirstActivity的代碼
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity ", "Task id is" + getTaskId());
setContentView(R.layout.first_layout);
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//顯式Intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
2.4SecondActivity的代碼
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity",this.toString());
setContentView(R.layout.second_layout);
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(SecondActivity.this,FirstActivity.class);
startActivity(intent);
}
});
}
2.5APP效果的視頻演示
[video(video-AjEy0Hds-1617800036102)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=459972266)(image-https://ss.csdn.net/p?http://i2.hdslb.com/bfs/archive/d7b685efad35c9ab42087962e6aa41631f12b078.jpg)(title-singleTop模式演示)]
3.singleTask 模式
singleTop 很好的解決了重復創建堆疊頂 Activity 的問題,如果 Activity 沒有處于堆疊頂的位置,還是可能會創建多個 Activity 實體的,如何解決這種問題呢?那就需要借助 singleTask 了,當 Activity 的啟動模式為 singleTask 的時候,每次啟動該 Activity 的時候系統會首先在回傳堆疊中檢查是否存在該 Activity 的實體,如果發現已經存在則直接使用該實體,并把這個 Activity 之上的所有 Activity 全部出堆疊,如果沒有就會創建一個新的 Activity 實體,
生命周期正常呼叫,onNewIntent 也會被呼叫,
3.1模式示意圖:

3.2ActivityManifest.xml的代碼
<activity android:name=".FirstActivity"
android:launchMode="singleTask"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3.3FirstActivity的代碼
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity ", "onRestart");
setContentView(R.layout.first_layout);
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//顯式Intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("FirstActivity", "onRestart: ");
}
}
3.4SecondActivity的代碼
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity",this.toString());
setContentView(R.layout.second_layout);
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(SecondActivity.this,FirstActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("SecondActivity","onDestroy ");
}
}
3.5APP效果的視頻演示
[video(video-4SgCKvYQ-1617805314522)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=757487122)(image-https://ss.csdn.net/p?http://i1.hdslb.com/bfs/archive/24d86939dee83c50ec49a6bd9f4d1947dad30d97.jpg)(title-singleTask模式演示)]
4.singleInstance 模式
singleInstance 模式的 Activity 會啟用一個新的回傳堆疊來管理這個 Activity (其實如果 singleTask 模式指定了不同的 taskAffinity,也會啟動一個新的回傳堆疊),意義:假如我們的程式中有一個 Activity 是允許其他程式呼叫的,如果我們想實作其他程式和我們的程式可以共享這個 Activity 實體,那么如何實作呢?假如使用前面 3 中啟動模式,肯定不行,因為,我們每個應用程式都有自己的回傳堆疊,雖然是同樣這個 Activity,但是在不同的回傳堆疊入堆疊的時候肯定是創建了新的實體了,而 singleInstance 可以解決這個問題,在這種模式下會有一個單獨的回傳堆疊來管理這個 Activity,不管是那個應用程式來訪問這個 Activity,都共用的同一個回傳堆疊,也就解決了共享 Activity 實體的問題,
4.1模式示意圖:

4.2ActivityManifest.xml的代碼
<activity android:name=".SecondActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
4.3FirstActivity的代碼
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity ", "Task id is"+getTaskId());
setContentView(R.layout.first_layout);
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//顯式Intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
4.4SecondActivity的代碼
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity","Task id is"+getTaskId());
setContentView(R.layout.second_layout);
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
}
4.5ThirdActivity的代碼
public class ThirdActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Log.d("ThirdActivity", "Task id is "+getTaskId());
}
}
4.6APP效果的視頻演示
[video(video-DnXXcWP8-1617805512686)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=502453955)(image-https://ss.csdn.net/p?http://i2.hdslb.com/bfs/archive/4b014f953f451a2aae22535fa1c312e40fd2b621.jpg)(title-singleInstance模式演示)]
總結
以上就是今天要講的內容,本文僅僅簡單介紹了Android的activity,

博主寫作整理不易,點贊加關注一下嘛,三連也可以,嘿嘿,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/273755.html
標籤:其他
