[Android学习之路]-Activity的启动方式
来源:互联网 发布:矩阵diag是什么意思 编辑:程序博客网 时间:2024/05/17 09:11
Activity的四种启动方式
在项目中,我们需要根据不同的需求为每个活动指定恰当的启动模式。启动模式一共有四种,分别是standard,singleTop,singleTask和singleInstance。接下来对每种启动模式进行详细的解读。
在此之前,先说明使用的代码。在项目中创建两个EmptyActivity,分别命名为FirstActivity和SecondActivity。两个活动的layout文件如下:
first_layout.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button 1" /></LinearLayout>second_layout.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button 2" /></LinearLayout>
1.standard模式
standard模式是活动默认的启动模式,如果我们没有显示地指定,那么所有活动都会自动使用这种启动模式。
在该模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶位置。系统在创建这一类活动时,不会考虑这个活动是否已经存在于返回栈中,每次都会创建一个新的实例。
现在我们修改FirstActivity的onCreate方法如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("FirstActivity",this.toString()); setContentView(R.layout.first_layout); Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ Intent intent = new Intent(FirstActivity.this,FirstActivity.class); startActivity(intent); } }); }即每次点击按钮都会启动一个FirstActivity,并且在启动的时候打印这个活动的序列号字符串。
运行结果如下:
05-28 01:57:25.685 2581-2581/com.example.njumzc.activitytest D/FirstActivity: com.example.njumzc.activitytest.FirstActivity@90845d0
05-28 01:57:48.313 2581-2581/com.example.njumzc.activitytest D/FirstActivity: com.example.njumzc.activitytest.FirstActivity@a4a31fb
05-28 01:58:18.529 2581-2581/com.example.njumzc.activitytest D/FirstActivity: com.example.njumzc.activitytest.FirstActivity@9236392
05-28 01:57:48.313 2581-2581/com.example.njumzc.activitytest D/FirstActivity: com.example.njumzc.activitytest.FirstActivity@a4a31fb
05-28 01:58:18.529 2581-2581/com.example.njumzc.activitytest D/FirstActivity: com.example.njumzc.activitytest.FirstActivity@9236392
可见,每一次启动都会创建一个新的活动。
2.singleTop模式
显然,standard每一次启动都会创建一个新的活动在很多情况下并不合理,会使系统创建大量相同的活动。在上例中,我们要启动的活动明明已经在栈顶了,却创建了一个新的活动。在这种情况下,使用singleTop模式就可以让系统在启动活动时对返回栈的栈顶进行检查,如果栈顶就是需要启动的活动,那么系统会直接使用它,而不会创建新的实例。
现在,修改AndroidManifes.xml文件中FirstActivity的启动模式,如下:
<activity android:name=".FirstActivity" android:label="This is first activity." android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>再次运行程序,点击按钮,会发现不论点击多少次,logcat中都不会有新的创建信息出现。
3.singleTask模式
使用singleTop模式可以避免重复创建栈顶活动,但是,如果该活动没有处于栈顶位置,还是可能会创建多个活动的实例。为了让返回栈中只存在活动的一个实例,我们可以使用singleTask启动模式。在此模式下启动活动时,系统首先会检查在返回栈中是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有则会创建一个新的实例。
现在,修改FirstActivity的启动模式为singleTask
<activity android:name=".FirstActivity" android:label="This is first activity." android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>修改FirstActivity,添加onRestart()方法:
@Override protected void onRestart() { super.onRestart(); Log.d("FirstActivity", "onRestart "); }
修改Intent语句:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("FirstActivity",this.toString()); setContentView(R.layout.first_layout); Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ Intent intent = new Intent(FirstActivity.this,SecoondActivity.class); startActivity(intent); } }); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_layout); Button button2 = (Button) findViewById(R.id.button_2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(SecoondActivity.this,FirstActivity.class); startActivity(intent); } }); }添加onDestroy()方法:
@Override protected void onDestroy() { super.onDestroy(); Log.d("SecondActivity", "onDestroy"); }启动程序,先进入FirstActivity,点击按钮,进入SecondActivity,再点击按钮,发现logcat记录如下:
05-28 02:20:37.662 25139-25139/com.example.njumzc.activitytest D/FirstActivity: onRestart
05-28 02:20:38.088 25139-25139/com.example.njumzc.activitytest D/SecondActivity: onDestroy
05-28 02:20:38.088 25139-25139/com.example.njumzc.activitytest D/SecondActivity: onDestroy
4.singleInstance模式
singleInstance在启动活动的时候会启用一个新的返回栈来管理这个活动,不管哪个应用程序来访问这个活动,都共用的同一个返回栈,通过这中方式可以解决不同程序中共享活动实例的问题。
现在,对代码进行如下修改:
修改SecondActivity启动模式:
<activity android:name=".SecoondActivity" android:label="This is second activity." android:launchMode="singleInstance"> <intent-filter> </intent-filter> </activity></application>修改两个活动的代码,打印taskId:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("FirstActivity","Task id is:"+getTaskId()); setContentView(R.layout.first_layout); Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ Intent intent = new Intent(FirstActivity.this,SecoondActivity.class); startActivity(intent); } }); }运行程序,点击按钮,结果如下:
05-28 02:32:31.241 3066-3066/com.example.njumzc.activitytest D/FirstActivity: Task id is:3005-28 02:32:34.942 3066-3066/com.example.njumzc.activitytest D/FirstActivity: Task id is:31
可见,确实启动了两个不一样的Task。
以上就是Activity的四种启动方式的解读。
阅读全文
1 0
- [Android学习之路]-Activity的启动方式
- Android之Activity的启动方式
- Android之activity的启动方式
- android学习之-activity的启动模式
- 【Android学习】之Activity的启动模式
- Android 学习之Activity的启动模式
- Android Activity的启动方式
- Android 启动Activity的方式
- Android Activity的启动方式
- Android学习:Activity的四种启动方式
- Android之activity四种启动方式
- Android学习之路:活动的四种启动方式
- Android Activity启动方式
- Android的四大组件之三--Activity(4)----->Activity的启动方式和相关参数
- Android学习笔记之Activity的启动模式
- Android学习笔记之Activity的生命周期和启动模式
- Android学习笔记之Activity的4种启动模式
- Android学习笔记之启动一个新的Activity
- BZOJ2324[ZJOI2011]营救皮卡丘
- perl里如何重命名名称带^M的目录
- java多线程(九) 之 同步工具类
- (140)环境反射
- java内存区域与内存溢出异常
- [Android学习之路]-Activity的启动方式
- JAXB "有两个名为 "**" 的属性,类的两个属性具有相同名称 "**""解决方案
- 泛型全解--Java基础081
- 【Wayland】初识Wayland(X、Mir)
- 面试准备总结
- Python实战(一)
- 配置wamp时候遇到的各种问题
- Apache kafka 工作原理介绍
- Codeforces 358D. Dima and Hares (DP)