Android Activity四种启动模式
来源:互联网 发布:软件自学网站大全 编辑:程序博客网 时间:2024/06/07 10:18
四种模式
- standard:标准模式,默认的加载模式。
- singleTop:Task栈顶单例模式。
- singleTask:Task内单例模式。
- singleInstance:全局单例模式。
Android采用Task来管理多个Activity,启动一个应用,即会创建一个Task。
可以调用Activity的getTaskId()方法来获取它所在的Task的ID。
测试代码:
MainActivity.java
public class MainActivity extends AppCompatActivity { @BindView(R.id.button) Button button; private String TAG = "---MainActivity---"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); Log.i(TAG, "TaskID:" + this.getTaskId()); } @OnClick(R.id.button) public void onViewClicked() { Intent intent = new Intent(this, MainActivity.class);//启动自己 //Intent intent = new Intent(this, OtherActivity.class);//启动另一个Activity startActivity(intent); }}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" tools:context="com.loadmodel.MainActivity"> <Button android:id="@+id/button" android:layout_width="200dp" android:layout_height="wrap_content" android:text="启动" /></LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.loadmodel"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:launchMode="singleTask">//此处修改加载模式 <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".OtherActivity"/> </application></manifest>
standard模式
运行上面的程序,点击按钮。程序会不断启动新的Activity实例,他们的TaskId相同,hashCode不同,表明这种加载模式不会使用新的Task。
singleTop模式
这种模式与standard模式基本相同,单有一点不同的是,当要启动的Activity已经位于Task顶时,不会创建新的实例,而是直接复用。
上面的程序如果改为singleTop模式,无论单击多少次,都不会有任何变化。
如果要启动的的activity没有位于Task顶,则会重新创建acticity实例,并加到栈顶,此时与standard模式完全相同。
singleTask模式
OtherActivity.java
public class OtherActivity extends AppCompatActivity { @BindView(R.id.button) Button button; private String TAG = "---MainActivity---"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); Log.i(TAG, "TaskID:" + this.getTaskId() + " hashCode:"+this.hashCode()); } @OnClick(R.id.button) public void onViewClicked() { Intent intent = new Intent(this,MainActivity.class); startActivity(intent); }}
修改MainActivity.java:
//Intent intent = new Intent(this, MainActivity.class);//启动自己 Intent intent = new Intent(this, OtherActivity.class);//启动另一个Activity startActivity(intent);
在这种加载模式下activity在一个Task只有一个实例,有如下3种情况:
- 如果将要启动的Activity不存在,系统会创建目标Activity的实例,并加入栈顶。
- 如果该Activity已经位于栈顶,此时与singleTop模式相同。
- 如果已经存在但是没有位于栈顶,系统会将该Activity上的所有Activity移出栈顶,是目标Activity转入栈顶。
测试
反复点击两个界面的启动按钮,结果如下:
分析
- 系统启动Task栈中自底向上Activity有两个实例:MainActivity,OtherActivity。(情况1)
- 系统程序入口进入MainActivity(情况3)
- MainActivity跳转到OtherActivity(情况1)
- OtherActivity跳转到MainActivity(情况3)
singleInstance模式
这种加载模式下,物料那个Task中启动目标的Activity,只会创建一个目标的Activity实例。并用一个全新的Task加载该Activity。
加载的Activity总是位于Task栈顶,且所在的Task只包含该Activity。
有如下两种情况:
- 如果将要启动的Activity不存在,先创建一个全新的Task,再创建目标Activity的实例,并加入栈顶。
- 该Activity已经存在,无论位于那个应用程序中,位于哪个Task中,系统会把该Activity所在的Task转到前台,是该Activity显示。
测试
修改AndroidManifest.xml:
<activity android:name=".OtherActivity" android:exported="true" android:launchMode="singleInstance"> <intent-filter> <action android:name="OtherActivity"/>//指定响应的字符串,可以隐式调用 <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
显示调用
反复点击两个界面的启动按钮,结果如下:
隐式调用
修改MainActivity.java
//Intent intent = new Intent(this, MainActivity.class); //Intent intent = new Intent(this, OtherActivity.class); Intent intent = new Intent(); intent.setAction("OtherActivity"); startActivity(intent);
分析
- 显示调用:MainActivity跳转到OtherActivity(情况1)
- 隐式调用:MainActivity跳转到OtherActivity(情况2)
demo下载地址
http://download.csdn.net/detail/demonliuhui/9825626
0 0
- Android入门:Activity四种启动模式
- Android Activity 四种启动模式
- Android Activity 四种启动模式 总结
- android Activity的四种启动模式
- Android Activity四种启动模式
- android activity四种启动模式
- Android:Activity四种启动模式
- Android入门:Activity四种启动模式
- Android Activity的四种启动模式
- Android学习:Activity四种启动模式
- android activity四种启动模式
- Android入门:Activity四种启动模式
- android中Activity四种启动模式
- Android-activity的四种启动模式
- Android Activity的四种启动模式
- android activity启动的四种模式
- android activity的四种启动模式
- Android 的 Activity 四种启动模式
- 直接插入排序
- BZOJ 1854 [Scoi2010]游戏——二分图匹配
- Git study notes
- 腾讯后台开发一面二面纪实
- 【前端-笔记】快乐的sublime编辑器(mac操作版)
- Android Activity四种启动模式
- 达内课程-JAVA八种基本类型
- Winform快捷键小结
- 2.[个人]C++线程入门到进阶(2)----线程同步之信号量(semaphore)
- Android Shape一些新玩法?
- 第 1 章:Web基础技术( Header Field )
- 阿里Maven仓库 -- Settings.xml
- API的相关类
- 单链表实现约瑟夫环