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

四种启动模式分别是: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@4a7a28f0
08-19 11:07:17.968 29925-29925/com.yiyajing.firstactivity D/MainActivity:MainActivity:com.yiyajing.firstactivity.MainActivity@4a79d148
08-19 11:07:18.708 29925-29925/com.yiyajing.firstactivity D/MainActivity:MainActivity:com.yiyajing.firstactivity.MainActivity@4a7a2338
08-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: 10
08-19 14:44:27.963 7529-7529/com.yiyajing.firstactivity D/ MainActivity: This is TaskId: 8

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值