在使用鼎鼎大名的 leakcanary 检测内存走漏时,咱们发现,增加了 leakcanary 依赖后,再次运转 app 时,桌面上会多一个使用图标。

如何让安卓应用有两个入口

翻开这个 Leaks 使用就能看到自己的 app 中存在的内存走漏。

让桌面上多一个使用图标,这是怎么做到的呢?

答案是使用 activity-alias

一、为使用设置两个进口,别离发动两个 Activity

举个例子,经过 activity-alias 为使用程序指定另一个进口:

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".SecondActivity"
    android:exported="false"
    android:taskAffinity="second.affinity"/>
<activity-alias
    android:name="SecondActivity"
    android:exported="true"
    android:icon="@mipmap/ic_launcher"
    android:label="SecondActivity"
    android:targetActivity=".SecondActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>

能够看到,使用进口是 MainActivity,但咱们经过 activity-alias 给 SecondActivity 也设置了使用进口的 intent-filter,装置后,桌面就会有两个进口:

如何让安卓应用有两个入口

点击两个图标就会发动两个不同的 Activity。这儿还给 SecondActivity 设置了 taskAffinity,目的是让 SecondActivity 发动时,被放在一个新的栈中。

二、为使用设置两个进口,发动同一个 Activity

activity-alias 增加进口时,是不是一定要发动不同的 Activity 呢?

答案是不一定。activity-alias 也允许咱们为同一个 Activity 定义多个别号,从而实现一个使用程序具有多个图标或多个发动进口的作用。

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity-alias
    android:name=".Alias"
    android:icon="@mipmap/ic_chrome"
    android:label="Fake Chrome"
    android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>

能够看到,使用进口是 MainActivity,但咱们经过 activity-alias 给 MainActivity 又设置了一个别号,装置后,桌面就会有两个进口:

如何让安卓应用有两个入口

点击两个图标都会发动同一个 Activity。

三、activity-alias 还能做什么?

如果咱们需要设置一个 Activity 支撑翻开网页,通常会采用这样的做法:

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
    </intent-filter>
</activity>

这儿给 MainActivity 增加了支撑翻开网页的 intent-filter。运转后,当遇到翻开链接的恳求时,就会弹出这样的对话框:

如何让安卓应用有两个入口

除了这种方法,activity-alias 也能够实现同样的功用。

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity-alias
    android:name=".browser"
    android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
    </intent-filter>
</activity-alias>

另外,activity-alias 还能够给咱们的使用再加一个 label 说明。

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity-alias
    android:name=".browser"
    android:label="My Browser"
    android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
    </intent-filter>
</activity-alias>

此时再翻开链接,就会在 My Application 底部展示咱们新增的 label: My Browser:

如何让安卓应用有两个入口

四、总结

activity-alias 为使用程序提供了更多的灵活性和可定制性。使用activity-alias,咱们能够为一个Activity定义多个进口,从而增强使用程序的用户体会。

五、参阅文章

# 冷常识 —— 如何实现 LeakCanary 桌面多出一个“新使用”的作用