您的位置:首页 > 移动开发 > Android开发

【Android】Activity启动模式

2016-02-24 00:22 302 查看
使用
Intent
启动
Activity
两种方法

使用显示
Intent
启动
Activity


显示使用
Intent
启动组件的时候需要明确指定被激活组件的名称。具体代码很简单,如下所示

Intent intent = new Intent(MainActivity.this, NextActivity.class);
startActivity(intent);


可以看到在创建
Intent
的时候需要接受两个参数,第一个参数是当前的上下文环境,第二个参数是即将要启动的
Activity
class
。也可以通过接受包名、类全路径名这两个参数来启动
Activity
,具体代码如下

intent.setClassName("com.example.demo", "com.example.demo.xxx");
startActivity(intent);


使用隐式
Intent
启动
Activity


没有明确指定将要启动的
Activity
类名的
Intent
称为隐式意图,
Android
系统会根据隐式意图中设置的动作
action
、来别
category
、数据类型和
Uri
等找到合适的组件,具体代码如下所示

/*
*
*
隐式使用Intent启动Activity
*
**/
<activity>
<inte1nt-filter>
<!--设置action属性,需要在代码中根据所设置的name打开指定的组件-->
<action android:name="com.example.demo" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>


上述代码中
<action>
标签制定了
setAction()
这个动作,
<category>
标签则包含了一些类别信息。只有当
<action>
<category>
中的信息都匹配时,相应的
Activity
才会被启动。代码如下所示

Intent intent = new Intent();
// 设置动作和清单文件一样
intent.setAction("com.example.demo");
startActivity(intent);


在上述代码中
intent.setAction("com.example.demo")
指定了
action
动作,这里并没有指定
category
类别,这是因为清单文件中
android:name="android.intent.category.DEFAULT"
是默认的
category
信息,最后
startActivity(intent)
隐式启动活动。

综上所述,显示
Intent
开启组件的时候必须明确指定要开启组件的类名,隐式
Intent
开启组件的时候要求
intent
设置的
action
动作和
category
类别一致。而且隐式
Intent
的功能要比显示
Intent
更加强大,不仅可以开启本应用的组件,还可以开启其他应用的组件和系统组件。

Activity
的四种启动模式

standard
,默认下即为标准模式,每次调用
startActivity()
方法就会创建一个新的
Activity
对象,它会进入任务栈并处于栈顶位置。对于使用
standard
模式的
Activity
系统不会判断这个
Activity
是否在栈中存在,每次启动都会创建一个新的
Activity
实例。

singleTop
,与
standard
模式类似,不同的是,如果要启动的
Activity
如果已经位于栈顶则直接使用它而不创建新的
Activity
实例。如果要启动的
Activity
没有位于栈顶时,则会创建一个新的
Activity
实例。

singleTask
,当
Activity
的启动模式指定为
singleTask
,每次启动该
Activity
时系统会首先检查栈中是否已经存在该
Activity
的实例,如果发现已经存在,就把当前
Activity
之上的所有
Activity
全部出栈,如果没有发现,就会在一个新的任务栈中创建一个该
Activity
的实例。如果希望
Activity
在整个应用程序中只存在一个实例可以使用
singleTask
模式。

singleInstance
,不同于上述三种模式,当
Activity
的启动模式指定为
singleInstance
时,系统会启用一个新的任务栈来单独管理这个
Activity
实例。所以
singleInstance
模式来加载
Activity
时,无论从哪个任务栈中启动该
Actiivty
,都只会创建一个该
Activity
的实例,分两种情况:如果要启动的
Activity
不存在,系统会先创建一个任务栈,然后创建该
Activity
的实例并把它加入栈顶,并且这个任务栈中不在加入其它
Activity
实例,只用来管理这一个
Activity
实例;如果要启动的
Activity
已经存在,无论位于哪个应用程序或者哪个任务栈中,系统都会把该
Activity
所在的任务栈转到前台,从而使该
Activity
显示出来。实际上在开发中如果需要
Activity
在整个系统中都只有一个实例,这时就需要用到
singleInstance
模式来启动。

另外需要注意的是,
Activity
的加载模式受到启动
Activity
Intent
对象中设置的
Flag
属性和注册文件
AndroidManifest.xml
<activity>
标签中的
android:launchMode
属性来交互控制。

Activity
任务栈

最后来介绍一下
Android
任务栈,也叫作
Android
管理栈。实际上开发者是无法控制
Activity
的状态的,而
Android
任务栈就是用来管理
Activity
的状态的。

一个应用程序由多个
Activity
组成,各
Activity
之间的关系很松散并没有直接的关联时,必须有一个
activity
被指定为主
activity
,他是程序启动时首先显示的界面。程序启动后所有
activity
都被放在一个栈中。当一个新
Activity
启动时,其实例将会移到栈顶。如果用户按后退键返回,或者前台的Activity结束,其实例都会被移出栈并销毁,位于其下方的
activity
就会被移上来并成为活动状态。

一个应用程序的优先级是受其最高优先级的
Activity
影响的。当决定某个应用程序是否要终结并释放资源时,
Android
内存管理使用栈决定基于
Activity
的应用程序的优先级。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: