介绍
<activity-alias>
标签是自从 Android API 1 以来就存在的清单文件标签。即使工作中参与开发过多个项目,这个标签也只用到过一次,这里介绍下它的用法和好处。
activity-alias
表示指向 Activity 的别名。通过这个别名就能启动对应的目标 Activity。别名将目标 Activity 呈现为独立实体。 它可以具有自己的一组 Intent 过滤器,这些 Intent 过滤器(而不是目标 Activity 本身的 Intent 过滤器)决定了哪些 Intent 可以通过别名激活目标,以及系统如何处理别名。
别名的语法:
<activity-alias android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string" >
. . .
</activity-alias>
下面介绍使用别名的用法:
1. 防止主屏幕的快捷图标消失
Activity 别名用于启动页面,可以防止启动页修改为其他 activity 时,在主屏幕中创建的快捷方式被删除(所有应用页面中仍然存在)。
如下创建一个 Activity,并设置为启动页面:
<activity
android:name=".SplashActivity"
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:
<activity
android:name=".OnboardingActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这时启动页由 SplashActivity 更改为了 OnboardingActivity,这时应用图标将从主屏幕消失(所有应用页面不会消失),有些 Launcher 应用中主屏幕中快捷图标不会消失,但是也不能打开应用了,会提示应用未安装。
这时因为修改了应用启动页面的名称,导致主屏幕中的快捷方式失效。
**解决方法:**在清单中创建了一个别名,并通过属性 targetActivity
指向目标类。这样只要保留别名就可以以任何所需的 Activity 为目标而不会有其他影响。
<activity android:name=".OnboardingActivity" />
<activity-alias
android:name=".Launcher"
android:targetActivity=".activity.SplashActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
这样避免了应用程序更新后意外丢失快捷方式。
2. 创建、管理多个指向同一 Activity 的图标
创建两个图标不同名称不同但指向相同页面的图标:
<activity
android:name=".MainActivity"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="App Name"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/Theme.MyApplication" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity-alias
android:name=".MainAlias"
android:enabled="true"
android:exported="true"
android:icon="@mipmap/ic_launcher_new"
android:label="New Name"
android:roundIcon="@mipmap/ic_launcher_new_round"
android:targetActivity=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
也可以在运行时决定启用或禁用哪个应用入口
// 禁用 MainActivity
packageManager.setComponentEnabledSetting(
ComponentName(this, "cn.itmob.demo.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
)
// 启用 AliasActivity
packageManager.setComponentEnabledSetting(
ComponentName(this, "cn.itmob.demo.AliasActivity"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)