Activity之启动模式区别及其应用场景

一、Activity启动方式及其应用场景

1.Activity启动方式共有一下几种

  standard

  singleTop

  singleTask

  singleInstance

  下面介绍一下每个启动方式的特点以及应用场景

1.standard

standard是默认的启动方式,没有配置launchMode默认是standard模式启动

下面看一下代码

MainActivity中:

startFirstAty.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startActivity(new Intent(MainActivity.this,FirstActivity.class));
    }
});
Log.d("MainActivity","Maininfo:"+this.toString());
Log.d("MainActivity","taskId:"+getTaskId());

FirstActivity中

Log.d("FirstActivity","Firstinfo:"+this.toString());
Log.d("FirstActivity","taskId:"+getTaskId());
重复启动FirstActivitty通过一下日志会发现MainActivity和FirstActivity所在同一个任务栈中。而每次standard启动FirstActivity标号都不同,说明任务栈的FirstActivity并没有得到复用。


04-06 14:28:27.433 25627-25627/com.example.donghe.launchmodedemo D/MainActivity: Maininfo:com.example.donghe.launchmodedemo.MainActivity@a212872
04-06 14:28:27.435 25627-25627/com.example.donghe.launchmodedemo D/MainActivity: taskId:218
04-06 14:28:27.531 25627-25745/com.example.donghe.launchmodedemo I/Adreno: QUALCOMM build                   : 4f3d4bc, I07a8b16b27
                                                                           Build Date                       : 10/26/17
                                                                           OpenGL ES Shader Compiler Version: XE031.09.00.04
                                                                           Local Branch                     : mybranch28842968
                                                                           Remote Branch                    : quic/gfx-adreno.lnx.1.0.r5-rel
                                                                           Remote Branch                    : NONE
                                                                           Reconstruct Branch               : NOTHING
04-06 14:28:27.535 25627-25745/com.example.donghe.launchmodedemo I/OpenGLRenderer: Initialized EGL, version 1.4
04-06 14:28:27.535 25627-25745/com.example.donghe.launchmodedemo D/OpenGLRenderer: Swap behavior 1
04-06 14:28:27.576 25627-25627/com.example.donghe.launchmodedemo W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
04-06 14:28:41.487 25627-25627/com.example.donghe.launchmodedemo V/BoostFramework: BoostFramework() : mPerf = com.qualcomm.qti.Performance@d477885
04-06 14:28:41.541 25627-25627/com.example.donghe.launchmodedemo I/Timeline: Timeline: Activity_launch_request time:83388484 intent:Intent { cmp=com.example.donghe.launchmodedemo/.FirstActivity }
04-06 14:28:41.697 25627-25627/com.example.donghe.launchmodedemo D/FirstActivity: Firstinfo:com.example.donghe.launchmodedemo.FirstActivity@43cb6a6
04-06 14:28:41.701 25627-25627/com.example.donghe.launchmodedemo D/FirstActivity: taskId:218
04-06 14:28:41.835 25627-25745/com.example.donghe.launchmodedemo D/OpenGLRenderer: endAllActiveAnimators on 0x7f7839c000 (RippleDrawable) with handle 0x7f78367ce0
04-06 14:28:49.707 25627-25627/com.example.donghe.launchmodedemo I/Timeline: Timeline: Activity_launch_request time:83396650 intent:Intent { cmp=com.example.donghe.launchmodedemo/.FirstActivity }
04-06 14:28:49.789 25627-25627/com.example.donghe.launchmodedemo D/FirstActivity: Firstinfo:com.example.donghe.launchmodedemo.FirstActivity@cfcbd18
04-06 14:28:49.790 25627-25627/com.example.donghe.launchmodedemo D/FirstActivity: taskId:218

04-06 14:28:49.877 25627-25745/com.example.donghe.launchmodedemo D/OpenGLRenderer: endAllActiveAnimators on 0x7f7839c000 (RippleDrawable) with handle 0x7f783da9a0


2.singleTop 称为栈顶复用

代码:

FirstActivity

startFirstAty=findViewById(R.id.btn_start_secondaty);
startFirstAty.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startActivity(new Intent(FirstActivity.this,SecondActivity.class));
    }
});
Log.d("FirstActivity","Firstinfo:"+this.toString());
Log.d("FirstActivity","taskId:"+getTaskId());

SecondActivity

startFirstAty=findViewById(R.id.btn_start_firstaty);
startFirstAty.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startActivity(new Intent(SecondActivity.this,FirstActivity.class));
    }
});
Log.d("SecondActivity","Maininfo:"+this.toString());
Log.d("SecondActivity","taskId:"+getTaskId());

新建SecondActivity 。设置FirstActivity的启动方式为singTop。从FirstActivity跳转到SecondActivity再从SecondActivity跳转到FirstActivity发现FirstActivity并没有复用。原因当从FirstActivity跳转到SecondActivity后栈顶的activity是SecondActivity,当从SecondActivity跳转到FirstActivity时由于FirstActivity并没有处于栈顶所以没有得到复用所以有重新创建了一个FirstActivity的实例,所以两个FirstActivity的id不一样。


04-08 10:32:34.652 13073-13073/com.example.donghe.launchmodedemo D/FirstActivity: Firstinfo:com.example.donghe.launchmodedemo.FirstActivity@9d37879
04-08 10:32:34.653 13073-13073/com.example.donghe.launchmodedemo D/FirstActivity: taskId:389
04-08 10:32:43.398 13073-13073/com.example.donghe.launchmodedemo I/Timeline: Timeline: Activity_launch_request time:164916138 intent:Intent { cmp=com.example.donghe.launchmodedemo/.FirstActivity }
04-08 10:32:43.461 13073-13073/com.example.donghe.launchmodedemo D/FirstActivity: Firstinfo:com.example.donghe.launchmodedemo.FirstActivity@8221730

04-08 10:32:43.462 13073-13073/com.example.donghe.launchmodedemo D/FirstActivity: taskId:389


3.singleTask

又称为栈内复用模式。这是一种单例模式,与singTop点类似,只不过singTop是检测栈顶元素是否有需要启动的Activity,而singTask则是检测整个栈中是否存在当前需要启动的Activity,如果存在就直接将该Activity置于栈顶,并将该Activity以上的Activity都从任务栈中移出销毁。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值