android10如何设置打开方式,Android启动方式
Android的四種LauchMode
Android使用任務棧Task來管理活動,一個任務就是一組存放在棧里的活動的集合,也稱為返回棧。
棧是一種后進先出的數據結構。
每當啟動一個新的活動,它會在返回棧中入棧,并處于棧頂的位置。
每當按下Back鍵或者調用finish()方法去銷毀一個活動時,處于棧頂的活動會出棧。
Android啟動模式一共四種,分別是standard、singleTop、singleTask、singleInstance。
在AndroidManifest.xml中通過標簽指定android:launchMode屬性設置啟動模式。
standard
默認模式,每當啟動一個新的活動,就會在返回棧中入棧,并處于棧頂的位置。
每次啟動都會創建該活動的一個實例。
public class MainActivity extends AppCompatActivity{
private static String TAG = "MainActivity";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(this.toString());
Log.i(TAG, this.toString());
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
點擊Button兩次 創建兩個新的MainActivity實例,需要點擊三次back才能退出程序。
I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@a79416d
I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@1691d81
I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@cff6062
singleTop
當活動的啟動模式指定為singleTop,在啟動活動時如果發現返回棧的棧頂是該活動,則通過調用onNewIntent()方法進行復用,不會再創建新的活動實例。
在AndroidManifest中設置
android:launchMode="singleTop">
public class MainActivity extends AppCompatActivity{
private static String TAG = "MainActivity";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(this.toString());
Log.i(TAG, this.toString());
Log.i(TAG, "onCreate走一遍");
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart(){
super.onStart();
Log.i(TAG, "onStart走一遍");
}
}
點擊Button不會創建新的實例,生命周期也不重新走。僅按一次back就可以退出程序。
如果MainActivity并未處于棧頂位置,再啟動MainActivity,還是會創建新的實例。
創建一個SecondActivity
在MainActivity中點擊跳轉到SecondActivity。
public class MainActivity extends AppCompatActivity{
private static String TAG = "MainActivity";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, this.toString());
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
啟動程序,創建MainActivity的實例
MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@a79416d
點擊Button按鈕,跳轉到SecondActivity,創建了SecondActivity的實例,SecondActivity在棧頂位置,MainActivity不在棧頂。
MainActivity: com.example.wkyyc.viewpagerdemo.SecondActivity@ffdc014
當在SecondActivity中點擊Button按鈕,MainActivity未在棧頂,MainActivity回到棧頂,創建MainActivity實例。
public class SecondActivity extends AppCompatActivity {
private static String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.i(TAG, this.toString());
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SecondActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
}
I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@2354529
現在按下back返回到SecondActivity,再按back返回MainActivity,再按back退出程序。
singleTask
當活動的啟動模式指定為singleTask,每次啟動該活動時系統首先會在返回棧中檢查是否存在該活動的實例,如存在直接調用onNewIntent()方法復用該實例,并把在這個活動之上的所有活動統統出棧,在棧內沒有則會創建一個新的實例。
設置MainActivity的啟動模式為singleTask,重寫MainActivity的onRestart()方法。重寫SecondActivity的onDestroy()方法。重寫SecondActivity的onDestroy
MainActivity代碼
啟動程序,生成MainActivity實例。
public class MainActivity extends AppCompatActivity{
private static String TAG = "MainActivity";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, this.toString());
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onRestart(){
super.onRestart();
Log.i(TAG, "onRestart: ");
}
}
I/MainActivity: com.example.wkyyc.viewpagerdemo.MainActivity@a79416d
點擊Button按鈕,跳轉到SecondActivity,創建了SecondActivity的實例
/MainActivity: com.example.wkyyc.viewpagerdemo.SecondActivity@3850e26
點擊SecondActivity的Button按鈕,跳轉到MainActivity。
public class SecondActivity extends AppCompatActivity {
private static String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.i(TAG, this.toString());
Button button = (Button)findViewById(R.id.button_1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SecondActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy(){
super.onDestroy();
Log.i(TAG, "onDestroy ");
}
}
MainActivity跳轉到SecondActivity時,SecondActivity處于棧頂,點擊SecondActivity的Button時,MainActivity設置為singleTask模式,在棧中存在MainActivity的實例,所以直接復用MainActivity的實例,而且還在SecondActivity實例的下面,于是SecondActivity會從返回棧中出棧,而MainActivity會成為新的棧頂,因此MainActivity的onRestart()方法和SecondActivity的onDestroy()方法會執行。
MainActivity: onRestart:
MainActivity: onDestroy
四種啟動方式應用場景
singleTop適合接收通知啟動的內容顯示頁面。
例如,某個新聞客戶端的新聞內容頁面,如果收到10個新聞推送,每次都打開一個新聞內容頁面是很煩人的。
singleTask適合作為程序入口點。
例如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,并且會清空主界面上面的其他頁面。
singleInstance適合需要與程序分離開的頁面。
例如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。系統的來電頁面,多次來電均是使用的同一個Activity。
singleInstance不要用于中間頁面,如果用于中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出后,在此啟動,首先打開的是B。
代碼中設定LauchMode
啟動 Activity ,我們需要傳遞一個 Intent,完全可以通過設置 Intent.setFlags(int flags) 來設置啟動的 Activity 的啟動模式。
需要注意的是:通過代碼來設置 Activity 的啟動模式的方式,優先級比清單文件設置更高。
FLAG_ACTIVITY_NEW_TASK
這個標識會使新啟動的 Activity 獨立創建一個 Task。
FLAG_ACTIVITY_CLEAR_TOP
這個標識會使新啟動的 Activity 檢查是否存在于 Task 中,如果存在則清除其之上的 Activity,使它獲得焦點,并不重新實例化一個 Activity,一般結合 FLAG_ACTIVITY_NEW_TASK 一起使用。
FLAG_ACTIVITY_SINGLE_TOP
等同于在 launcherMode 屬性設置為 singleTop。
總結
以上是生活随笔為你收集整理的android10如何设置打开方式,Android启动方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android scrollview 底
- 下一篇: android fragment动态添加