1. 程式人生 > >Android面試——Activity的四種啟動模式

Android面試——Activity的四種啟動模式

前言

今天開始,會逐步總結Android面試可能遇到的各種問題及其知識點總結。為的就是今天4月份的晉升面試或者更好機會的面試能夠拿出100%的狀態。

有興趣的同學,也可以關注我的Android面試資料夾。

Activity四種啟動模式

Activity一共有四種啟動模式,分別是:

  1. standard
  2. singleTop
  3. singleTask
  4. singleInstance

在具體介紹這四種啟動模式之前,我們先來簡單介紹一下Android任務棧。

Android任務棧

一個Android應用程式功能通常會被拆分成多個Activity,各個Activity之間通過Intent進行連線。在Android系統中,是通過棧結構(FILO的線性表)來儲存整個App的Activity,棧底元素是整個任務棧的發起者。
當一個App啟動時,首先會檢測當前環境中是否存在該App的任務棧,果然不存在,那麼系統就會建立一個任務棧給這個App。這個App所啟動的Activity都將在這個棧中進行管理,這個棧也被成為是一個Task.(ps:這裡是針對standard模式來進行簡單闡述)。
需要特別注意的是:由於Activity有四種不同的啟動模式,因此導致一個Task中的Activity可能來自不同的App,同一個App的Activity也可能不在一個Task中。

檢視Activity任務棧的命令

下面介紹幾條常用命令用來檢視Activity的任務棧:

  1. adb shell dumpsys activity : 檢視ActivityManagerService的所有資訊。
  2. adb shell dumpsys activity activities : 檢視Activity的元件資訊。
  3. adb shell dumpsys activity services : 檢視Service的元件資訊。
  4. adb shell dumpsys activity providers: 檢視ContentProvider資訊。
  5. adb shell dumpsys activity broadcasts: 檢視BroadCastReceiver資訊。
  6. adb shell dumpsys activity intents: 檢視intent資訊。
  7. adb shell dumpsys activity processes:檢視程序資訊。

示例程式碼

首先,定義兩個Activity,分別為MainActivity和SecondActivity。且其佈局中均只有一個Button按鈕。
其中,MainActivity中的按鈕點選事件為啟動SecondActivity,而SecondActivity中的按鈕事件用來啟動自己。

MainActivity.java

public class MainActivity extends
Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { Button mButton1 = (Button) findViewById(R.id.button1); mButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startSecondActivity(); } }); } private void startSecondActivity() { Intent intent = new Intent("com.imooc.wzy.secondactivity"); startActivity(intent); } }

SecondActivity.java

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        initView();
    }

    private void initView() {
        Button button = (Button) findViewById(R.id.id_send);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startSelf();
            }
        });
    }

    private void startSelf() {
        Intent intent = new Intent("com.imooc.wzy.secondactivity");
        startActivity(intent);
    }
}

並且,為了模擬跨程序啟動Activity,我們講SecondActivity的android:process設定為“:remote”。從而,SecondActivity和MainActivity是位於兩個程序中。

standard

預設的啟動模式,如果不指定Activity的啟動模式,則使用這種方式啟動Activity。
這種啟動模式每次都會建立新的例項,就在之前start這個Activity所在Activity的任務棧建立新的例項。

示例程式碼:

<activity
    android:name="com.lczh.gaint.ui.MainActivity"
    android:launchMode="standard">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name="com.lczh.gaint.ui.SecondActivity"
    android:launchMode="standard"
    android:process=":remote">
    <intent-filter>
        <action android:name="com.imooc.wzy.secondactivity" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</activity>

圖示:
activity_mode_standard

singleTop

如果指定啟動Activity是singleTop模式,那麼在啟動時,系統會判斷當前棧頂Activity是不是要啟動的Activity,如果是則不建立新的Activity而直接引用這個Activity,如果不是,則建立這個Activity。。
這種啟動模式雖然不會建立新的例項,但是系統仍然會在Activity啟動時呼叫onNewIntent方法。

示例程式碼:

<activity
    android:name="com.lczh.gaint.ui.SecondActivity"
    android:launchMode="singleTop"
    android:process=":remote">
    <intent-filter>
        <action android:name="com.imooc.wzy.secondactivity" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</activity>

圖示:
android_mode_singleTop