在使用鼎鼎大名的 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 桌面多出一个“新使用”的作用