第四例:Intent啟動Activity的幾種方式(一)
“standard” (預設)
“singleTop”
“singleTask”
“singleInstance”
一、standard
xml中配置,android:launchMode = "standard"
<activity android:name=".app.ui.IntentLaunchModeActivity" android:launchMode="standard" android:label="@string/label_intent_mode"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.SAMPLE_CODE" /> </intent-filter> </activity>
開啟Activity,然後點選Acitivity,啟動當前Activity,然後再點選,再點選,再點選...檢視日誌,可以看到onCreate被多次呼叫.按返回鍵的時候,會回到同一個Activity.package demo.my.com.myapidemo.app.ui; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import demo.my.com.myapidemo.R; /** * Created by Hack on 2015/10/13. */ public class IntentLaunchModeActivity extends Activity{ private String TAG = "apidemo"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG,"onCreate start"); setContentView(R.layout.leftcycle_activity); } @Override protected void onNewIntent(Intent intent) { Log.i(TAG,"onNewIntent start"); super.onNewIntent(intent); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP){ Intent intent = new Intent(IntentLaunchModeActivity.this,IntentLaunchModeActivity.class); startActivity(intent); } return super.onTouchEvent(event); } }
二、singleTop
開啟Activity,然後點選Acitivity,啟動當前Activity,然後再點選,再點選,再點選...檢視日誌,可以看到onNewIntetn被多次呼叫.按返回鍵的時候,退出或是上一個進入的Activity.
三、singleTask
新建一個Activity2.點選啟動Activity ->Activity2->Activity->Activity2……
四、singleInstance
將三中的Activity改成singleInstance模式. 點選啟動Activity ->Activity2->Activity->Activity2…… 每次都是onNewIntent,而不是onCreate
總結:
“拿來主義”standard模式。哪裡需要呼叫我我就去哪裡,可以多次例項化,可以幾個相同的Activity重疊。
“拒絕堆疊”singleTop模式。可以多次例項化,但是不可以多個相同的Activity重疊,當堆疊的頂部為相同的Activity時,會呼叫onNewIntent函式
“獨立門戶”singleTask模式。同一個應用中呼叫該Activity時,如果該Activity沒有被例項化,會在本應用程式的Task內例項化,如果已經例項化,會將Task中其上的Activity銷燬後,呼叫onNewIntent;其它應用程式呼叫該Activity時,如果該 Activity沒有被例項化,會建立新的Task並例項化後入棧,如果已經例項化,會銷燬其上的Activity,並呼叫onNewIntent。一句 話,singleTask就是“獨立門戶”,在自己的Task裡,並且啟動時不允許其他Activity凌駕於自己之上。
“孤獨寂寞”singleInstance模式。載入該Activity時如果沒有例項化,他會建立新的Task後,例項化入棧,如果已經存在,直接呼叫 onNewIntent,該Activity的Task中不允許啟動其它的Activity,任何從該Activity啟動的其他Activity都將被 放到其他task中,先檢查是否有本應用的task,沒有的話就建立。