第一行代碼(第三版)第三章總結

第一行代碼(第三版)第三章總結

1. Activity

1.1 Activity概念

Activity爲安卓四大組件之一(Activity/Service/BroadCast Recevicer/Content provider)。Activity主要負責與用戶交互,提供一個顯示的屏幕。

1.2 創建Activity

  1. 新建類MainActivity繼承Activity基類。
public class MainActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //...
    }
}

代碼中繼承的AppCompatActivity類與Activity類的區別在於,AppCompatActivity類對很多控件做了向下兼容參考博客1

  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

  1. 按下Back返回鍵即可銷燬當前的Activity。
  2. 調用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在各種狀態之間切換時會調用相應的方法,如下:

  1. OnCreate():Activity第一次被創建的時候調用,可以在這裏完成初始化和事件調用操作。
  2. OnStart():在Activity由不可見變得可見的時候調用。
  3. OnResume():在Activity準備好和用戶進行交互的時候調用。
  4. OnPause():在Activity部分可見的時候調用。
  5. OnStop():在Activity完全不可見的時候調用。
  6. OnDestroy():在Activity銷燬的時候調用。
  7. OnRestart():在Activity由不可見重新變爲運行狀態前調用。

參考生存週期圖,來自參考博客3

在這裏插入圖片描述

如果進程被系統殺掉了,則會直接調用OnCreate而不是OnRestart,同時由於一些臨時數據會丟失,會影響用戶體驗,因此需要使用Activity中的OnSaveInstanceState方法來解決這個問題。OnSaveInstanceState方法會攜帶一個Bundle類型參數,可以提供一系列的方法保存變量。同時恢復的時候只需要在OnCreate()函數的第一個Bundle參數中即可獲取。

1.4.4 Activity啓動模式

在實際項目中可以爲指定的Activity設置如下四種啓動模式:

  1. standard
  2. singleTop
  3. singleTask
  4. 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表示動作的類別,只有兩個都匹配上了才能成功,並且支持跨程序調用同時,actioncategory都可以自定義。

<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)
    {
        //...
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章