ITmob-Ly
发布于 2023-02-23 / 270 阅读
0

Manifest 中 Activity 别名的介绍和两种用法

介绍

<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>

Android Activity alias.png

也可以在运行时决定启用或禁用哪个应用入口

// 禁用 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
)