第一行代碼(第三版)第三章總結
1. Activity
1.1 Activity概念
Activity爲安卓四大組件之一(Activity/Service/BroadCast Recevicer/Content provider)。Activity主要負責與用戶交互,提供一個顯示的屏幕。
1.2 創建Activity
- 新建類MainActivity繼承Activity基類。
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
//...
}
}
代碼中繼承的AppCompatActivity類與Activity類的區別在於,AppCompatActivity類對很多控件做了向下兼容參考博客1。
- 在
AndroidManifest.xml
文件中註冊該Activity。
<activity
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
intent-filter
用於過濾Intent的屬性,匹配成功才能啓動該Activity參考博客2。個人認爲上面代碼中的action和category內的信息的意義相當於表示啓動該APP的時候會發出啓動命令(包含這兩條相同的action和catergory),過濾後即匹配上了MainActivity類,將該類當做啓動的Activity初始化。
1.3 銷燬Activity
- 按下Back返回鍵即可銷燬當前的Activity。
- 調用Activity的
finish()
即可銷燬當前的Activity。
1.4 Activity生命週期
1.4.1 返回棧
一個app可能有多個Activity,新的Activity會覆蓋在舊的Activity上,而Activity使用棧(後進先出)來存儲多個Activity。
1.4.2 Activity狀態
每個Activity在其生命週期內最多會有4種狀態:
1.運行狀態
當一個Activity處於棧頂的時候,就是運行狀態。
2.暫停狀態
當一個Activity不處於棧頂,但是屬於可見的狀態(別的Activity部分遮擋了該Activity),就進入了暫停狀態。
3.停止狀態
當一個Activity不處於棧頂,並且完全不可見的時候,就進入了停止狀態,系統會爲其保留狀態和變量,但是當內存不足的時候隨時會被系統回收。
4.銷燬狀態
當一個Activity從返回棧移除後,就變成了銷燬狀態。
1.4.3 Activity生存期
Activity在各種狀態之間切換時會調用相應的方法,如下:
OnCreate()
:Activity第一次被創建的時候調用,可以在這裏完成初始化和事件調用操作。OnStart()
:在Activity由不可見變得可見的時候調用。OnResume()
:在Activity準備好和用戶進行交互的時候調用。OnPause()
:在Activity部分可見的時候調用。OnStop()
:在Activity完全不可見的時候調用。OnDestroy()
:在Activity銷燬的時候調用。OnRestart()
:在Activity由不可見重新變爲運行狀態前調用。
參考生存週期圖,來自參考博客3:
如果進程被系統殺掉了,則會直接調用OnCreate而不是OnRestart,同時由於一些臨時數據會丟失,會影響用戶體驗,因此需要使用Activity中的OnSaveInstanceState方法來解決這個問題。OnSaveInstanceState方法會攜帶一個Bundle類型參數,可以提供一系列的方法保存變量。同時恢復的時候只需要在OnCreate()
函數的第一個Bundle參數中即可獲取。
1.4.4 Activity啓動模式
在實際項目中可以爲指定的Activity設置如下四種啓動模式:
- standard
- singleTop
- singleTask
- singleInstance
以上四種都可以在AndroidManifest.xml
文件中通過給<activity>
指定android:launchMode
屬性來設置,接下來分別介紹四種啓動模式。
1.standard
默認的啓動模式。每啓動一個新Activity,就會在返回棧中入棧,並且處於棧頂位置,同時不管這個Activity是否已經在棧中存在,都會創建該Activity的新實例。
2.singleTop
與標準方式的區別在於,當啓動新Activity時,如果發現Activity在棧中已經存在並且在棧頂,那麼就不會創建新的實例而是用棧頂的這個實例。
3.singleTask
與singleTop模式的區別在於,當啓動新Activity時,如果發現當前的Activity實例存在,不管是否在棧中哪個位置,都會將在該Activity上面的Activity實例全部出棧,然後使用該Activity。如果不存在則與標準模式相同,啓動一個新的Activity。
4.singleInstance
與上面三種模式都不同,該模式下,指定了singleInstance的Activity會在一個新的返回棧中處理,這個返回棧可以與其它程序共享(注意,每個程序都有自己的返回棧),這樣的意義在於,不同的程序可以共享同一個Activity實例。
2. Intent
2.1 Intent概念
Intent是安卓程序中各個組件之間交互的一種重要方式,不僅可以執行各種動作,還可以傳遞數據。例如用於啓動Activity、啓動服務,發送廣播等。同時Intent可以分爲顯式Intent和隱式Intent。
2.2 顯式Intent
直接指定要啓動的Activity。
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
2.3 隱式Intent
隱式Intent不明確指定啓動哪個Activity,而是設置Action、Data、Category,讓系統來篩選出合適的Activity。篩選是根據所有的<intent-filter>
來篩選。
<activity android:name="com.example.app.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
action
是一個字符串,表示執行的動作,category
表示動作的類別,只有兩個都匹配上了才能成功,並且支持跨程序調用。同時,action
和category
都可以自定義。
<intent-filter>
<action android:name="android.intent.action.DIY_ACTION" />
<category android:name="android.intent.category.DIY_CATEGORY" />
</intent-filter>
2.4 Intent傳遞數據
第一個Activity啓動第二個Activity:
Intent intent = new Intent("com.example.app.SecondActivity");
intent.putExtra("str","hello world");
startActivity(intent);
第二個Activity接收第一個傳來的數據:
getIntent().getStringExtra("str");
當然還可以結合Intent和Bundle,同時保存多個數據在Bundle中再將Bundle放在Intent中進行傳遞數據。
2.2 Intent返回數據
第一個Activity啓動第二個Activity:
Intent intent = new Intent("com.example.app.SecondActivity");
startActivityForResult(intent,1);
第二個Activity返回數據:
Intent data = new Intent();
data.putExtra("str","helloworld");
setResult(1,data);
finish();
這裏的data只用來傳遞數據,沒有任何意圖。
第一個Activity接收數據:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1)
{
//...
}
}