Android基礎復習——Activity
Activty 是什么
Activity 是 Android 四大應用組件(分別是Activity,Service,Content Provider, Broadcast Receiver)之一。
Activity 為用戶提供在 Android 設備屏幕上交互的界面。不管用戶是打電話,發(fā)短信,刷微博,都會有 Activity 的身影。
不信的話,我們可以使用 adb 命令查看當前界面的 Activity:
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'


通過上面的結果,我們可以知道酷安APP當前界面的Activity是com.coolapk.market/.view.main.MainActivity
Activty 怎么用
Activity 的生命周期
- 創(chuàng)建我們自己的Activty,一般是繼承自
Activity或是它的子類(如AppCompactActivity)。 - 在 Activity 的生命周期方法中,實現(xiàn)我們自定義界面或業(yè)務邏輯。在
onCreate()方法中調用setContentView()設置 Activity
的界面。 - 像
onCreate()方法一樣,Activity
中有類似這樣一共七個生命周期方法。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onStart() {
super.onStart()
}
override fun onResume() {
super.onResume()
}
override fun onPause() {
super.onPause()
}
override fun onStop() {
super.onStop()
}
override fun onDestroy() {
super.onDestroy()
}
override fun onRestart() {
super.onRestart()
}
}
那么問題來了,不同的生命周期方法,我們對應應該做哪些事情呢。
在這之前,我們必須了解Activity的三種狀態(tài)。
- 運行中(resumed): Activity 位于屏幕前臺并且有焦點
- 暫停(paused): Activity 可見(但是有其他Activity處于運行中的狀態(tài))
- 停止(stopped): Activity處于后臺,被其他Activity完全遮擋
| 方法 | 說明 | 做什么 |
|---|---|---|
| onCreate | 在創(chuàng)建Activity時調用 | 創(chuàng)建視圖,綁定數(shù)據等 |
| onStart | Activity即將可見 | 繪制元素,運行動畫 |
| onResume | Activity開始與用戶交互,Activity位于Activity棧頂層且有焦點 | |
| onPause | 系統(tǒng)開始啟動其他Activity時調用 | 確認對持久性數(shù)據的未保存更改、停止動畫以及其他可能消耗 CPU 的內容 ps:不能執(zhí)行耗時的操作,否則其他Activity在它執(zhí)行完之前不能執(zhí)行 |
| onStop | 對用戶不可見時調用 | 停止UI刷新,運行動畫以及繪制元素 |
| onDestroy | 在Activity被銷毀時調用 | 執(zhí)行Activity銷毀前的清除工作 |
| onRestart | 在 Activity 已停止并即將再次啟動前調用。 |
下面這個圖時Android生命周期流程圖,很好的描述了Activity的完整生命周期以及其中的鉤子方法。

其中onCreate到onDestroy是Activity的完整生命周期
onStart和onStop是可見生命周期
onResume和onPause是前臺生命周期
Activity 的注冊
在AndroidManifest文件中聲明注冊Activity,在android:name中聲明要注冊的Activity
的類名。其他屬性可以參考文檔
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<application ...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
intent-filter是為應用組件聲明的Intent過濾器,通過這些過濾器(根據 Intent 的操作、數(shù)據和類別指定自身接受的 Intent 類型)過濾被傳遞到應用組件(如Activity)的隱式Intent。
Activity 的啟動
- 啟動Activity( startActivity方法)
val intent = Intent(this,SecondActivity::class.java)
intent.putExtra("data", 123)//傳遞參數(shù)
startActivity(intent)
- 啟動Activity并獲得結果 ( startActivityForResult 方法)
val pickIntent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
startActivityForResult(pickIntent, PICK_CONTACT_REQUEST)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if(resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
//處理返回結果
}
Activity的啟動模式
共有四種啟動模式:standard,singleTop,singleTask,singleInstance
| 啟動模式 | 特點 | 應用場景 |
|---|---|---|
| standard | 啟動此模式的Activity,會創(chuàng)建一個新的Activity的實例 | 默認場景,通常Activity都是使用這種 |
| singleTop | 分兩種情況:1.啟動的Activity在棧頂,不創(chuàng)建新的實例,調用Activity的onNewIntent方法 2.不在棧頂,創(chuàng)建新的實例 | 適合有就更新,沒有就創(chuàng)建的場景(如搜索) |
| singleTask | 只有一個實例,若不存在則創(chuàng)建,反之,此Activity之上的其他Activity 都出棧 | APP的入口,當通過其他方式調用APP的時候,不會反復創(chuàng)建主頁面。例如其他APP調用自己的應用的時候。 |
| singleInstance | 在新的任務(Task)中開啟,并且任務中有且只有這一個實例。若不存在則創(chuàng)建,反之,調用Activity的onNewIntent方法 | 適合和APP分離的且不需要反復創(chuàng)建的界面 |
我們可以反編譯一下常用的APP,查看其中的AndroidManifest文件,就能對啟動模式有更好的理解了。
<!--網易云音樂的主界面Activity singleTask--!>
<activity android:name="com.netease.cloudmusic.activity.MainActivity" android:launchMode="singleTask" />
<!--百度地圖的消息處理Activity singleInstance--!>
<activity android:theme="@style/Theme.NoDisplay" android:name="com.baidu.android.pushservice.opproxy.OpNotifyActivity" android:exported="true" android:launchMode="singleInstance" android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="com.baidu.BaiduMap.action.RECEIVE_MCS_MESSAGE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<!--微信的語音撥號Activity singleTop--!>
<activity android:name="com.tencent.mm.plugin.ipcall.ui.IPCallDialUI" android:launchMode="singleTop" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation|screenSize"/>