详解Android中Activity的四大启动模式实验简述
作为android四大组件之一,activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握。今天我们就来通过实验演示,来帮助大家理解activity的四大启动模式。
演示效果如下:
第一步:实验前准备,相关配置文件以及activity的建立
(1)androidmainfest.xml配置文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.intentflags"> <application android:allowbackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsrtl="true" android:theme="@style/apptheme"> <activity android:name=".mainactivity"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> //另外两个activity <activity android:name=".main2activity"> </activity> <activity android:name=".main3activity"></activity> </application> </manifest>
(2)layout中三个activity的三个布局文件activity_main.xml(这里演示一个,其余两个只是下面textview文字不一样)
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.intentflags.mainactivity"> <button android:text="第一个页面" android:layout_width="match_parent" android:layout_height="wrap_content" android:onclick="click1" /> <button android:text="第二个页面" android:layout_width="match_parent" android:layout_height="wrap_content" android:onclick="click2" /> <button android:text="第三个页面" android:layout_width="match_parent" android:layout_height="wrap_content" android:onclick="click3" /> <textview android:layout_width="match_parent" android:layout_height="match_parent" //其余两个仅文字不一样 android:text="第一个页面" android:textsize="50sp"/> </linearlayout>
(3)java中三个activity的实现代码mainactivity.java(仅演示一个,其他两个完全相同)
import android.content.intent; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.util.log; import android.view.view; /** * created by panchengjia on 2016/12/14. */ public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); //其他两个界面此处引用各自对应的layout文件 setcontentview(r.layout.activity_main); } public void click1(view view){ intent intent = new intent(this,mainactivity.class); startactivity(intent); //记录taskid用于实验说明 log.i("tag","页面一taskid:"+gettaskid()); } public void click2(view view){ intent intent = new intent(this,main2activity.class); startactivity(intent); log.i("tag","页面二taskid:"+gettaskid()); } public void click3(view view){ intent intent = new intent(this,main3activity.class); startactivity(intent); log.i("tag","页面三taskid:"+gettaskid()); } }
第二步:standard默认(标准)模式下的演示实验
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同activity叠加。
我们的操作结果如下图:
log图如下(未记录回退log):
通过分析操作图以及log,得出这种standard模式是每次都会创建新的activity对象,当点击返回按钮时,他会将栈顶(当前activity)消灭,然后跳 到下一层,这种模式可能大多数情况下不是我们需要的,因为对系统性能的消耗过大。
第三步:singletop模式下的演示实验(设置页面二为singletop)
在当前任务栈中,判断栈顶是否为当前的activity,如果是,就直接使用,如果不是,再创建新的activity放入栈顶。
androidmainfest.xml中设置代码如下:
<activity android:name=".main2activity" android:launchmode="singletop"> </activity>
我们的操作结果如下图:
log图如下(未记录回退log):
分析此启动模式和singletop在名字上即可看出区别,即singletop每次只检测当前栈顶的activity是否是我们需要请求创建的,而 singletask则会检测栈中全部的activity对象,从上向下,如果检测到是我们所请求的则会消灭此activity对象上面的对象,直接把检测到的我们需要的activity置为栈顶。
第四步:singletask模式下的演示实验(设置页面二为singletask)
在当前任务栈中,判断栈里是否存在activity,如果不存在,创建一个新activity入栈,如果存在,会把该activity之上的所有activity清除出栈,显示当前activity。
androidmainfest.xml中设置代码如下:
<activity android:name=".main2activity" android:launchmode="singletask"> </activity>
我们的操作结果如下图:
log图如下(未记录回退log):
只有一个实例。在同一个应用程序中启动他的时候,若activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它activity destory掉并调用它的onnewintent方法。如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个activity,singletask允许别的activity与其在一个task*存,也就是说,如果我在这个singletask的实例中再打开新的activity,这个新的activity还是会在singletask的实例的task中。
第五步:singleinstance模式下的演示实验(设置页面二为singleinstance)
新创建一个任务栈,放入新创建的activity,该任务栈只允许存在一个activity实例,如果已存在,那么会切换到该任务栈。
androidmainfest.xml中设置代码如下:
<activity android:name=".main2activity" android:launchmode="singleinstance"> </activity>
我们的操作结果如下图:
log图如下(未记录回退log):
浏览器工作原理类似,我们都知道在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的activity对象在当前的栈中只存在一个。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。