Android學習(一)activity
什麼是activity?
Activity 類是 Android 應用的關鍵組件。它是直接被用戶觀察並進行交互使用。activity官網簡介。
Activity 提供窗口供應用在其中繪製界面。此窗口通常會填滿屏幕,但也可能比屏幕小,並浮動在其他窗口上面。要在應用中使用 Activity,您必須在應用的清單中註冊關於 Activity 的信息,並且必須適當地管理 Activity 的生命週期。
activity的基本用法
我們可以直接爲項目添加一個Empty Activity,這樣Android Studio會自動幫我們創建好一個activity需要的全部資源,我們就可以直接進行開發。
我們也可以自己手動創建activity,這樣對一個完整activity所需要的資源,有個更深刻的印象:
- 手動創建activity
不勾選Generate Layout File 和 Launcher Activity;
- 創建和加載佈局資源
在layout目錄下創建Layout resource file。
當佈局文件創建完成後,我們在第一步創建好activity的onCreate()方法中調用setContentView()方法,爲當前activity加載一個佈局。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
- 在 AndroidManifest文件中註冊
在< activity >標籤中使用android:name聲明具體註冊哪一個activity
<activity android:name=".MainActivity">
</activity>
注意:如果該activity爲程序的主活動,還需要額外聲明,否則程序無法運行。在 < activity >標籤中加入< intent-filter >標籤並添加:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
探索Intent在activity中的使用
- 使用顯式Intent進行activity跳轉
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
- 使用隱式Intent進行activity跳轉
在AndroidManifest文件中的< activity >中加入< intent-filter >標籤並添加如下:
<action android:name="com.test.activity.secondActivity">
<category android:name="android.intent.category.DEFAULT">
然後在代碼中添加如下:
Intent intent = new Intent("com.test.activity.secondActivity");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
區別在於,不需要指定具體跳轉activity,可以使用在AndroidManifest文件中聲明的消息進行跳轉。
- 向下一個activity傳遞數據
跳轉前進行數據存儲,代碼如下:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("test_string", "hello world");
startActivity(intent);
跳轉後進行數據讀取,代碼如下:
Intent intent = getIntent();
String data = intent.getStringExtra("test_string");
- 返回數據給上一個activity
其中主要使用的是啓動activity的startActivityForResult()方法。該方法會在啓動的activty銷燬時,將需要的數據返回給上一個activity。
首先,在FirstActivity內部調用startActivityForResult()方法,代碼如下:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
其次,在SecondActivity內部調用setResult()方法存儲需要返回的數據,再結束當前activity,代碼如下:
Intent intent = new Intent();
intent.putExtra("test_string", "hello world");
setResult(RESULT_OK, intent);
finish();
最後,在FirstActivity內部重寫onActivityResult()方法來接收來自SecondActivity返回的數據。
注意,其中的requestCode和resultCode要對應。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode) {
case 1:
if (requestCode == RESULT_OK) {
String s = data.getStringExtra("test_string");
}
break;
default:
break;
}
}
activity的生命週期
掌握activity的生命週期是很重要的,瞭解熟悉它後,對我們的開發中資源的創建和釋放很有幫助。
活動狀態
其中有4個狀態,如下:
- 運行狀態
- 暫停狀態
- 停止狀態
- 銷燬狀態
activity的生存期
方法名 | 描述說明 |
---|---|
onCreate() | 當activity第一次創建時,最先執行一次。適用於初始化佈局、控件等等。 |
onRestart() | 當activity在不可見情況下,重新獲取焦點後,活動重新運行。從停止狀態變爲運行狀態時,調用此方法。 |
onStart() | 當activity可見時調用此方法。 |
onResume() | 當activity開始與用戶交互時調用此方。注意,此時activity位於其活動堆棧的頂部 |
onPause() | 當activity失去前臺狀態,不再可聚焦,該activity對用戶仍然可見時調用。注意,如果activity返回到前臺,則緊跟着執行onResume()。如果用戶看不到,則緊跟着執行onStop()。 |
onStop() | 當activity對用戶不再可見時調用此方法。這通常用於停止動畫和刷新UI等。注意,如果該activity返回與用戶交互,則執行onRestart(),如果該activity消失,則執行onDestroy()。 |
onDestroy() | 在activity被銷燬之前最後調用此方法。發生這種情況的原因可能是activity即將結束。 |
活動的啓動模式
Android提供了4種啓動模式,在開發中,我們需要根據實際情況對activity配置不同啓動模式。
配置方法,在AndroidManifest文件中在< activity >標籤中使用android:launchMode聲明使用模式類型。
standard
該模式是默認模式,未聲明的activity默認使用此模式。
該模式下,每啓動一次activity,它就會入棧,並處於棧頂位置。即時棧中已經存在該activity,它也會創建新的實例併入棧。
singleTop
該模式下,啓動一個activity時,會判斷棧頂是否已經是該activity。如果是,則不創建新的activity。如果不是,則創建新的activity併入棧。
singleTask
該模式比較常用,在啓動一個activity時,會判斷棧中判斷是否已經存在該activity。如果存在,則將該activity之上的其他activity全部出棧,直到該activity處於棧頂結束。如果不存在,則創建新的activity併入棧。
singleInstance
該模式比較特殊。在啓動一個activity時,會啓動一個新的棧來管理該activity。適用場景是需要和其他app共同管理時。