Activity在Android APP中的重要性不言而喻,那么了解Activity的几种不同的启动方式对设计出好的App至关重要!
众所周知Activity的启动方式有如下几种
1.在“Home”下点击图标,启动应用程序的首个Activity。我们称之为主Activity,这是最常见的启动方式,而且代表程序具备独立的运行条件。通常会在Manifest中指定某个Activity的android.intent.category属性为Launcher。 (实际上这也是隐式启动Activity的其中一个)
2.在程序中启动Activity。应用(startActivity() 或者startActivityForResult())启动特定的Activity,或者当程序需要处理一些特定的功能,而其他应用程序中已经具备了这种功能的Activity时,我们可以通过intent-filter来启动Activity
3.强制程序仅以被其它程序调用的方式启动(没有直接的启动入口):在系统中有相当一部分的应用程序需要有严格的运行条件(Context),其无法以Stand alone的方式独立运行于进程中。具备这种特性的Application大体上分为两种:其一,带有特定返回值的应用程序。parent出于当前操作需要,通过启动其它Application来获得某些特定的资源。例如:输入法或者文件资源选择器等。另外一种情况,经常被调用来修改系统设置或者提供单一有特定目的的操作。这样的Application无需在Home中提供快捷启动方式,其仅仅被其它某些程序在特定的需求下来满足需求。例如:更换系统铃音程序。
4.在一个Application中包含有多个Mian Activities,并且各自具备有独立的启动入口:很多开发者都习惯于默认的开发配置,一个Application仅仅包含一个独立的应用。然后在特定的需求下可以打破这个限定,系统允许开发者将多个Main Activities应用捆绑在同一个Application中,而且这些Main Activities可以在Home中有独立的启动快捷方式。然而有非常重要的一点需要特别强调,这种方式并不提倡在任何情况下采用,一般当两个应用程序需要调用相同的系统资源或者包含有大部分相同功能的应用时,才可以考虑采用这种方式来简化用户的安装过程(另外一个角度来看,起到优化系统资源的目的)。技术上需要注意为不同的Main Activity定义不同的Task affinity。例如:Camera和Camcorder,它们共同使用摄像头,而且同样采用Gallery作为资源管理器,他们的Task Affinity分别设置为:”com.android.camera” 和 “com.android.videocamera”。
5.以Widget的方式体现Activity的应用价值:严格意义上来看,这的确算得上是一种启动方式,某些Application将部分常用的功能以Widget的形式在Home或者其它Application中被引用。
接下来,我们介绍一下有关隐式启动:
(1) 根据Action和Category信息来进行匹配
在Manifest.xml中注册该Activity
<activity android:name=".TestActivity" android:label="TestActivity">
<intent-filter >
<action android:name="cn.xiaoyao.test"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在MainActivity.java里启动该Activity:
Intent intent = new Intent();
intent.setAction( "cn.xiaoyao.test");//设置intent的Action属性值
intent.addCategory(Intent.CATEGORY_DEFAULT);//不加这行也行,因为这个值默认就是Intent.CATEGORY_DEFAULT
startActivity( intent );
(2) 根据Action和Data信息进行匹配
在Manifest.xml中注册该Activity
<activity android:name=".TestActivity" android:label="@string/testactivity">
<intent-filter>
<action android:name="cn.xiaoyao.test"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<data android:scheme="xiaoyao"></data>
</intent-filter>
</activity>
如上注册信息,合法的Uri的写法如下:
//Uri uri = Uri.parse("xiaoyao");//不行
//Uri uri = Uri.parse("xiaoyao://");//可以
//Uri uri = Uri.parse("xiaoyao:");//可以
//Uri uri = Uri.parse("xiaoyao://www.google.com/getDetails?id=123");//可以
在MainActivity.java里启动该Activity:
Intent intent = new Intent();
intent.setAction("cn.xiaoyao.test");//仅有data不能匹配,所以要设置Action属性
intent.addCategory(Intent.CATEGORY_DEFAULT);//可去除
intent.setData(uri);//设置data属性
startActivity(in);
(3) 根据action和data的mimeType属性匹配
在Manifest.xml中注册该Activity
<activity android:name=".TestActivity" android:label="@string/testactivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
在MainActivity.java里启动该Activity:
Intent intent = new Intent();
intent .setAction("android.intent.action.VIEW");
intent .addCategory(Intent.CATEGORY_DEFAULT);//可去掉
intent.setType("vnd.android.cursor.dir/vnd.google.note");//要设置Data的MIMEType属性
startActivity(intent );
注意:一个Activity中可以包括多个intent-filter属性,intent-filter属性中也可以包含多个data标签对,只需要有一个满足便可以匹配成功
如果匹配不到合适的Activity启动时,会抛出异常给用户一个提示“应用程序意外停止”!
部分参考博文: http://www.cnblogs.com/leaven/archive/2011/10/11/2207678.html
原文网址:点击打开链接