1. 程式人生 > >第四例:Intent啟動Activity的幾種方式(一)

第四例:Intent啟動Activity的幾種方式(一)

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>

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);
    }
}
開啟Activity,然後點選Acitivity,啟動當前Activity,然後再點選,再點選,再點選...檢視日誌,可以看到onCreate被多次呼叫.按返回鍵的時候,會回到同一個Activity.

二、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,沒有的話就建立。