【Android】Activity启动模式

来源:互联网 发布:淘宝购物怎么返利 编辑:程序博客网 时间:2024/05/18 00:32

使用Intent启动Activity两种方法

  • 使用显示Intent启动Activity

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

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

可以看到在创建Intent的时候需要接受两个参数,第一个参数是当前的上下文环境,第二个参数是即将要启动的Activityclass。也可以通过接受包名、类全路径名这两个参数来启动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的加载模式受到启动ActivityIntent对象中设置的Flag属性和注册文件AndroidManifest.xml<activity>标签中的android:launchMode属性来交互控制。

Activity 任务栈

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

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

一个应用程序的优先级是受其最高优先级的Activity影响的。当决定某个应用程序是否要终结并释放资源时,Android内存管理使用栈决定基于Activity的应用程序的优先级。

0 0
原创粉丝点击