活动的四种启动模式(第一行代码总结)
来源:互联网 发布: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是有单间的啦!!!
- 活动的四种启动模式(第一行代码总结)
- 第一行代码2.5-活动的启动模式
- (第一行代码笔记)活动的4种启动模式详解
- 第一行代码学习笔记-第二章 探究活动-4.活动的启动模式
- andorid的四种启动模式 (第一行代码学习)
- Android Studio 活动的启动模式 standard singleTop singleTask singleInstance 第一行代码
- 第一行安卓代码——活动的启动模式2.5
- 《第一行代码》启动活动最佳写法
- 活动的四种启动模式
- 活动的四种启动模式
- 活动的四种启动模式
- Android 活动的四种启动模式
- 活动的四种启动模式
- 活动的四种启动模式
- 安卓中活动的四种启动模式
- Android活动的四种启动模式
- Android活动的四种启动模式
- Android活动的四种启动模式
- 【Hibernate】(4)Hibernate的多表操作、级联操作与延迟加载
- 剑指offer--二叉树的下一个节点
- Java BIO与NIO比较
- string 的一些用法——插入(insert)、删除(erase)、替换(replace)和查找(find)
- ubuntu16 安装pyinstaller 显示command not found
- 活动的四种启动模式(第一行代码总结)
- hdu 6138 Fleet of the Eternal Throne (ac自动机)
- MFC中遇到的关于error C4430: 缺少类型说明符
- 647. Palindromic Substrings
- 二叉排序树
- XML
- servlet生命周期
- CURL使用SSL证书访问HTTPS
- 最长递增子序列问题