文章目錄
- 深入分析 Android Activity (二)
- 1. `Activity` 的啟動模式(Launch Modes)
- 1.1 標準模式(standard)
- 1.2 單頂模式(singleTop)
- 1.3 單任務模式(singleTask)
- 1.4 單實例模式(singleInstance)
- 2. 深入理解 Intent 和 Intent Filters
- 2.1 Intent
- 2.2 Intent Filter
- 3. Activity 的進程和線程模型
- 3.1 進程
- 3.2 線程
- 4. Activity 與 Service 的交互
- 4.1 啟動服務
- 4.2 綁定服務
- 總結
深入分析 Android Activity (二)
1. Activity
的啟動模式(Launch Modes)
Android 提供了幾種不同的啟動模式,用于定義 Activity
的啟動行為。這些模式通過 AndroidManifest.xml
文件中的 android:launchMode
屬性或 Intent
標志進行配置。
1.1 標準模式(standard)
這是默認的啟動模式。每次啟動 Activity
都會創建一個新的實例,無論該 Activity
是否已經存在于棧中。
<activity android:name=".MyActivity"android:launchMode="standard">
</activity>
1.2 單頂模式(singleTop)
如果當前任務的棧頂已經有該 Activity
實例,則重用該實例,并調用其 onNewIntent
方法,否則創建新的實例。
<activity android:name=".MyActivity"android:launchMode="singleTop">
</activity>
使用 Intent
標志也可以實現相同效果:
Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
1.3 單任務模式(singleTask)
在棧中只保留一個 Activity
實例。如果實例存在,則將其置于棧頂,并調用其 onNewIntent
方法,否則創建新的實例。
<activity android:name=".MyActivity"android:launchMode="singleTask">
</activity>
1.4 單實例模式(singleInstance)
創建一個單獨的任務棧來管理該 Activity
,并且在該任務棧中只存在這一個 Activity
實例。
<activity android:name=".MyActivity"android:launchMode="singleInstance">
</activity>
2. 深入理解 Intent 和 Intent Filters
2.1 Intent
Intent
是 Android 中用于在不同組件(如 Activity
、Service
和 BroadcastReceiver
)之間傳遞數據和請求操作的消息對象。主要分為兩種類型:
- 顯式
Intent
:明確指定目標組件的Intent
。 - 隱式
Intent
:不指定目標組件,通過Intent Filter
進行匹配。
顯式 Intent
示例:
Intent intent = new Intent(this, MyActivity.class);
startActivity(intent);
隱式 Intent
示例:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com"));
startActivity(intent);
2.2 Intent Filter
Intent Filter
用于在 AndroidManifest.xml
中聲明 Activity
、Service
或 BroadcastReceiver
能夠響應的 Intent
類型。
<activity android:name=".MyActivity"><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="http" android:host="www.example.com"/></intent-filter>
</activity>
3. Activity 的進程和線程模型
3.1 進程
默認情況下,每個應用程序在獨立的 Linux 進程中運行。應用程序中的所有組件(Activity
、Service
、BroadcastReceiver
和 ContentProvider
)都在同一個進程中運行。
可以在 AndroidManifest.xml
中通過 android:process
屬性為某些組件指定不同的進程:
<activity android:name=".MyActivity"android:process=":remote"/>
3.2 線程
Android 的主線程(也稱為 UI 線程)用于處理 UI 更新和用戶交互。因此,不能在主線程中執行耗時的操作,以避免阻塞 UI 響應。可以使用 AsyncTask
、HandlerThread
或 Executor
框架在后臺線程中執行耗時操作。
使用 AsyncTask
進行后臺操作:
private class DownloadTask extends AsyncTask<URL, Integer, Long> {protected Long doInBackground(URL... urls) {// Perform background task}protected void onProgressUpdate(Integer... progress) {// Update UI progress}protected void onPostExecute(Long result) {// Update UI with result}
}
4. Activity 與 Service 的交互
Service
是在后臺運行的組件,用于執行長時間運行的操作。Activity
可以通過 startService
和 bindService
與 Service
交互。
4.1 啟動服務
startService
用于啟動服務:
Intent intent = new Intent(this, MyService.class);
startService(intent);
4.2 綁定服務
bindService
用于綁定服務,并獲取 IBinder
以進行通信:
Intent intent = new Intent(this, MyService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
ServiceConnection
用于管理 Service
的連接和斷開:
private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {MyService.LocalBinder binder = (MyService.LocalBinder) service;myService = binder.getService();isBound = true;}@Overridepublic void onServiceDisconnected(ComponentName name) {isBound = false;}
};
總結
Android Activity
的設計涉及多個方面,包括生命周期管理、啟動模式、視圖管理、進程和線程模型、以及與其他組件(如 Fragment
和 Service
)的交互。理解 Activity
的設計原理和內部實現,有助于開發者構建高效、穩定和響應迅速的應用程序。通過深入分析和理解這些關鍵概念,開發者可以在實際項目中靈活應用這些知識,提升應用程序的用戶體驗和性能。
歡迎點贊|關注|收藏|評論,您的肯定是我創作的動力 |