活动的四种启动模式(第一行代码总结)

来源:互联网 发布:java调用url接口 编辑:程序博客网 时间:2024/06/05 21:59

四种启动模式分别是:standard,singleTop,singleTask,singleInstance
它们的启动方法都是通过给<activity> 标签指定android.launchMode属性来选择启动模式
共同点:他们都使用返回栈来管理活动(Activity).(你们问我返回栈是什么?呵呵哒,一个抽象的玩意儿,可以想成一个房间,活动就是这个房间的住客)
看它们的不同点:
1.standard是默认的启动模式(也是最不嫌麻烦的模式),每次启动一个活动,这个活动就会入栈并且在栈的最顶端,而且,,无论返回栈里面是否曾经创建过该活动,,每次启动都会重新创建该活动的新实例.(代码如下)

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private static final String TAG = "MainActivity";    Button FirBtn;    Button DiaBtn;    private Intent intent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);//在这打印一下每次启动这个活动时的活动的实例        Log.d(TAG, "MainActivity: " + this.toString());        setContentView(R.layout.activity_main);        FirBtn = (Button) findViewById(R.id.btn_FirAct);        DiaBtn = (Button) findViewById(R.id.btn_DiaAct);        FirBtn.setOnClickListener(this);        DiaBtn.setOnClickListener(this);    }//不要费解,你没看错,我就是要在这个Activity里面启动这个Activity(自己启动自己)    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btn_DiaAct:                intent = new Intent(MainActivity.this, MainActivity.class);                startActivity(intent);                break;        }    } }

打印的log:

08-19 11:07:16.248 29925-29925/? D/MainActivity: MainActivity: com.yiyajing.firstactivity.MainActivity@4a7a28f008-19 11:07:17.968 29925-29925/com.yiyajing.firstactivity D/MainActivity:MainActivity:com.yiyajing.firstactivity.MainActivity@4a79d14808-19 11:07:18.708 29925-29925/com.yiyajing.firstactivity D/MainActivity:MainActivity:com.yiyajing.firstactivity.MainActivity@4a7a233808-19 11:07:20.718 29925-29925/com.yiyajing.firstactivity D/MainActivity:MainActivity:com.yiyajing.firstactivity.MainActivity@4a79bbd4

2.singleTop看名称就已经了解了,当启动活动时,如果这个活动已经处于返回栈的栈顶了,那么就会直接使用该实例,而不会再重新创建新的活动实例。But: 如果活动不在栈顶端,那么还是要重新创建的(说白了,我要找的人如果不在门口站着,,,我就当他不存在,,,(额,什么理论)).
清单文件修改(把MainActivity的启动模式改为singleTop):

<activity android:name=".MainActivity"          android:launchMode="singleTop">   <intent-filter>       <action android:name="android.intent.action.MAIN"/>       <category          android:name="android.intent.category.LAUNCHER"/>   </intent-filter></activity>

点击三次按钮,打印的log(其他代码还是上面那套代码,,不重新放了啊)

08-19 11:11:48.954 1981-1981/com.yiyajing.firstactivity D/MainActivity: MainActivity: com.yiyajing.firstactivity.MainActivity@4a7a3c08

无论启动多少次,只要这个活动还在栈顶,就不会重新创建,但是如果该活动不在栈顶了,再次启动的时候就会重新创建该活动的实例。

3.singleTask这个启动模式弥补了singleTop的不足,只要活动选择了这个启动模式。每次启动活动的时候,它都会在返回栈中寻找该活动的实例,如果实例存在,那么就把这个活动上面的所有活动统统出栈,该活动放在栈顶(臭流氓)。如果没有发现该活动实例,那么就会创建一个新的活动实例。
4.singleInstance(我最特殊)当你将一个活动指定为singleInstance为启动模式的时候,它会启动一个新的返回栈来管理这个活动(牛比吧,老子有单间),至于为嘛要这么特殊,是为了方便别的应用程序共享这个活动的实例。咱们来实验一下,打印一下同一个应用程序下边,返回栈的ID,看看是不是有活动在搞特殊(代码如下):

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private static final String TAG = "MainActivity";    Button FirBtn;    Button DiaBtn;    private Intent intent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //首先打印这个默认返回栈的ID        Log.d(TAG, "This is TaskId: " + getTaskId());        setContentView(R.layout.activity_main);        FirBtn = (Button) findViewById(R.id.btn_FirAct);        DiaBtn = (Button) findViewById(R.id.btn_DiaAct);        FirBtn.setOnClickListener(this);        DiaBtn.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btn_DiaAct:                intent = new Intent(MainActivity.this, MainActivity.class);                startActivity(intent);                break;  //跳转到启动模式为singleInstance的活动中            case R.id.btn_FirAct:                intent = new Intent(MainActivity.this, FirstActivity.class);                startActivity(intent);                break;        }    }

首先打印了这个应用默认的返回栈的ID,接下来我们把FirstActivity这个活动的启动模式改为singleInstance,,并且打印这个活动的栈的ID,,,跟应用程序的ID比较(看下面代码)

public class FirstActivity extends AppCompatActivity implements View.OnClickListener {    private static final String TAG = "FirstActivity";    Button firstBtn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //打印启动模式为singleInstance的活动的栈的ID        Log.d(TAG, "This is TaskId: "+ getTaskId());        setContentView(R.layout.first_activity);        firstBtn = (Button) findViewById(R.id.btn_First);        tvText = (TextView) findViewById(R.id.tv_Text);        firstBtn.setOnClickListener(this);    }   }

修改清单文件里面的launchMode(代码如下)

<activity android:name=".FirstActivity"           android:launchMode="singleInstance"></activity>

OK,到现在为止,,大通铺有了,,单间也有了,,我们去打印一下它们的房间号,结果是:

08-19 14:44:06.203 7529-7529/com.yiyajing.firstactivity D/ FirstActivity: This is TaskId: 1008-19 14:44:27.963 7529-7529/com.yiyajing.firstactivity D/ MainActivity: This is TaskId: 8

我们看到了,房间号不一样,FirstActivity是有单间的啦!!!

原创粉丝点击