开发者在设计之初可以决定用户与应用程序的交互方式,其中包括如何选着程序启动入口以及Package中所包含的Activities。众所周知,应用程序是一系列有着特定功能的Activities组成,它们有自己的属性和行为。用户可以在Home中通过启动快捷方式将当前进程引入特定的Activites,或者可以在其它程序进程中启动外部的Activities。有的人会问,了解程序的启动方式有用吗?当然,了解不同的启动方式才能更好的根据需要设计Activities。
下边将介绍五种与其相关的设计模式:
- 通过Home中的快捷方式图标(或者下拉的Application Launcher)启动:这是最常见的启动方式,而且代表程序具备独立的运行条件。通常会在Manifest中指定某个Activity的android.intent.category属性为Launcher。
- 在其它程序中间接启动:这体现了Activities在Android中一个非常重要的特性“重用性”,例如:用户在当前的操作过程中希望将特定的信息通过Email的方式发送给好友,一般情况下会利用系统默认的处理邮件Activity响应这项请求,如果恰巧此时系统中存在其它类似intent-filter的Activites,那么将会提供给用户一个可选择的对话框,用户可以根据需要启动恰当的应用程序,这个过程可以看作为间接的启动Applications。或者在预知当前系统配置的情况下,直接应用(startActivity() 或者startActivityForResult())启动特定的Activity。
- StartActivity(): 通过这种方式启动应用程序可以看作为独立运行于系统中,启动它的parent无需得到其所运行的返回值,更具体的讲是一个Standalone的应用程序启动了另一个有着同样Standalone特性的程序。
- StartActivityForResult(): 通过方法的命名可以很直观的看到,其最大的作用是当启动了某个Activity后,parent依然关联着当前进程所处理的Activity。当操作完成后,会有特定的返回值作为Parent响应某些Events的结果。(Androidres.com)
- 强制程序仅以被其它程序调用的方式启动(没有直接的启动入口):在系统中有相当一部分的应用程序需要有严格的运行条件(Context),其无法以Stand alone的方式独立运行于进程中。具备这种特性的Application大体上分为两种:其一,带有特定返回值的应用程序。parent出于当前操作需要,通过启动其它Application来获得某些特定的资源。例如:输入法或者文件资源选择器等。另外一种情况,经常被调用来修改系统设置或者提供单一有特定目的的操作。这样的Application无需在Home中提供快捷启动方式,其仅仅被其它某些程序在特定的需求下来满足需求。例如:更换系统铃音程序。
- 在一个Application中包含有多个Mian Activities,并且各自具备有独立的启动入口:在特定的需求下可以打破单个入口这个限定,系统允许开发者将多个Main Activities应用捆绑在同一个Application中,而且这些Main Activities可以在Home中有独立的启动快捷方式。然而有非常重要的一点需要特别强调,这种方式并不提倡在任何情况下采用,一般当两个应用程序需要调用相同的系统资源或者包含有大部分相同功能的应用时,才可以考虑采用这种方式来简化用户的安装过程(另外一个角度来看,起到优化系统资源的目的)。技术上需要注意为不同的Main Activity定义不同的Task affinity。例如:Camera和Camcorder,它们共同使用摄像头,而且同样采用Gallery作为资源管理器,他们的Task Affinity分别设置为:”com.android.camera” 和 “com.android.videocamera”。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.iss.test" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TestIconActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TestActivity" android:label="@string/app_name"
android:icon="@drawable/icon">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
- 以Widget的方式体现Activity的应用价值(见android widget 开发实例 : 桌面便签程序的实现详解和源码):严格意义上来看,这的确算得上是一种启动方式,某些Application将部分常用的功能以Widget的形式在Home或者其它Application中被引用。
以上是Android系统中在不同的需求下来启动Activity的方式,开发者可以根据特定的需求为Application设定一种恰当的启动方式来充分的“为人民服务”。