Android面試——Activity的四種啟動模式
前言
今天開始,會逐步總結Android面試可能遇到的各種問題及其知識點總結。為的就是今天4月份的晉升面試或者更好機會的面試能夠拿出100%的狀態。
有興趣的同學,也可以關注我的Android面試資料夾。
Activity四種啟動模式
Activity一共有四種啟動模式,分別是:
- standard
- singleTop
- singleTask
- 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的任務棧:
- adb shell dumpsys activity : 檢視ActivityManagerService的所有資訊。
- adb shell dumpsys activity activities : 檢視Activity的元件資訊。
- adb shell dumpsys activity services : 檢視Service的元件資訊。
- adb shell dumpsys activity providers: 檢視ContentProvider資訊。
- adb shell dumpsys activity broadcasts: 檢視BroadCastReceiver資訊。
- adb shell dumpsys activity intents: 檢視intent資訊。
- 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>
圖示:
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>
圖示: