# Android中Activity四种启动模式和taskAffinity属性详解(1 原创分享)

# AndroidActivity四种启动模式和taskAffinity属性详解(1 原创分享)

----------影子侠开发者社区Rong

 

android应用开发中,打造良好的用户体验是非常重要的。而在用户体验中,界面的引导和跳转是值得深入研究的重要内容。在开发中,与界面跳转联系比较紧密的概念是Task(任务)和Back Stack(回退栈)。activity的启动模式会影响TaskBack Stack的状态,进而影响用户体验。除了启动模式之外,Intent类中定义的一些标志(以FLAG_ACTIVITY_开头)也会影响TaskBack Stack的状态。在这篇文章中主要对四种启动模式进行分析和验证,其中涉及到activity的一个重要属性taskAffinityIntent中的标志之一FLAG_ACTIVITY_NEW_TASK。关于Intent中其他标志位的具体用法会在另一篇文章中介绍。

 

Task是一个存在于Framework层的概念,容易与它混淆的有Application(应用)和Process(进程)。在开始介绍Activity的启动模式的使用之前,首先对这些概念做一个简单的说明和区分。

 

## ApplicationTaskProcess的区别与联系 ##

 

application翻译成中文时一般称为“应用”或“应用程序”,在android中,总体来说一个应用就是一组组件的集合。众所周知,android是在应用层组件化程度非常高的系统,android开发的第一课就是学习android的四大组件。当我们写完了多个组件,并且在manifest文件中注册了这些组件之后,把这些组件和组件使用到的资源打包成apk,我们就可以说完成了一个applicationapplication和组件的关系可以在manifest文件中清晰地体现出来。如下所示:

 

    <?xml version="1.0" encoding="utf-8"?> 

         <manifest android:versionCode="1" 

        android:versionName="1" 

        xmlns:android="http://schemas.android.com/apk/res/android" 

        package="com.example.android.myapp"> 

 

             <application android:label="@string/app_name"> 

                 <activity android:name=".MyActivity" android:label="@string/app_nam"> 

                     <intent-filter> 

                         <action android:name="android.intent.action.MAIN" /> 

                         <category android:name="android.intent.category.LAUNCHER" /> 

                     </intent-filter> 

                 </activity> 

                       <receiver android:name=".MyReceiver"/> 

                       <provider android:name=".MyProvider"/> 

                       <service android:name=".MyService"/> 

             </application> 

         </manifest> 

 

由此可见,application是由四大组件组成的。在app安装时,系统会读取manifest的信息,将所有的组件解析出来,以便在运行时对组件进行实例化和调度。

 

task是在程序运行时,只针对activity的概念。说白了,task是一组相互关联的activity的集合,它是存在于framework层的一个概念,控制界面的跳转和返回。这个task存在于一个称为back stack的数据结构中,也就是说,framework是以栈的形式管理用户开启的activity。这个栈的基本行为是,当用户在多个activity之间跳转时,执行压栈操作,当用户按返回键时,执行出栈操作。举例来说,如果应用程序中存在A,B,C三个activity,当用户在LauncherHome Screen点击应用程序图标时,启动主Activity A,接着A开启BB开启C,这时栈中有三个Activity,并且这三个Activity默认在同一个任务(task)中,当用户按返回时,弹出C,栈中只剩AB,再按返回键,弹出B,栈中只剩A,再继续按返回键,弹出A,任务被移除。如下图所示:

 

![](https://img-blog.csdn.net/20130902165607281?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdqZ19ibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

 

task是可以跨应用的,这正是task存在的一个重要原因。有的Activity,虽然不在同一个app中,但为了保持用户操作的连贯性,把他们放在同一个任务中。例如,在我们的应用中的一个Activity A中点击发送邮件,会启动邮件程序的一个Activity B来发送邮件,这两个activity是存在于不同app中的,但是被系统放在一个任务中,这样当发送完邮件后,用户按back键返回,可以返回到原来的Activity A中,这样就确保了用户体验。

 

说完了applicationtask,最后介绍processprocess一般翻译成进程,进程是操作系统内核中的一个概念,表示直接受内核调度的执行单位。在应用程序的角度看,我们用java编写的应用程序,运行在dalvik虚拟机中,可以认为一个运行中的dalvik虚拟机实例占有一个进程,所以,在默认情况下,一个应用程序的所有组件运行在同一个进程中。但是这种情况也有例外,即,应用程序中的不同组件可以运行在不同的进程中。只需要在manifest中用process属性指定组件所运行的进程的名字。如下所示:

 

     <activity android:name=".MyActivity" android:label="@string/app_nam"

                   android:process=":remote">

         </activity>

 

这样的话这个activity会运行在一个独立的进程中。

此文章系原创,如需转载,请注明出处影子侠开发者社区www.yingzixia.com


转载于:https://my.oschina.net/u/2312592/blog/376609

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值