You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为Android任务视图添加替代图标?API 26场景实现方案

嘿,这个问题我刚好有经验!Android从API 26(也就是Android 8.0 Oreo)开始正式支持为任务视图(Recents屏幕)设置单独的替代图标,Facebook用的就是这个特性。下面给你两种实现方式,按需选择:

实现任务视图替代图标的两种方式

方式一:静态配置(Manifest中固定设置)

这种方式适合不需要动态切换图标的场景,一次配置永久生效:

  • 第一步:准备专属的任务视图图标。建议做单色、高对比度的简洁样式(比如Facebook那种反色图标),并适配不同分辨率:
    • 48x48dp(mdpi)
    • 72x72dp(hdpi)
    • 96x96dp(xhdpi)
    • 144x144dp(xxhdpi)
    • 192x192dp(xxxhdpi)
      把这些图标放到对应的mipmap-xxx目录下,比如命名为ic_launcher_recents
  • 第二步:修改AndroidManifest.xml,找到你的主启动Activity(带有MAINLAUNCHER intent-filter的那个),添加<meta-data>标签指定任务图标:
<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>
    <!-- 核心:指定任务视图使用的替代图标 -->
    <meta-data
        android:name="android.app.taskIcon"
        android:resource="@mipmap/ic_launcher_recents" />
</activity>

方式二:动态设置(代码中灵活切换)

如果需要根据场景(比如主题切换、用户操作)动态更换任务视图图标,就用这种方式:

  • 在Activity的生命周期方法(比如onCreate)中,创建ActivityManager.TaskDescription对象并设置:

Java代码示例

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 仅在API26及以上版本生效
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        // 构建任务视图描述对象
        ActivityManager.TaskDescription taskDesc = new ActivityManager.TaskDescription(
            getString(R.string.app_name), // 任务视图显示的应用名(可选,默认用AppManifest里的名称)
            BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_recents), // 自定义任务图标
            getResources().getColor(R.color.task_background) // 任务视图的背景色(可选)
        );
        // 设置到当前Activity
        setTaskDescription(taskDesc);
    }
}

Kotlin代码示例

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val taskDesc = ActivityManager.TaskDescription(
            getString(R.string.app_name),
            BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher_recents),
            resources.getColor(R.color.task_background, theme)
        )
        setTaskDescription(taskDesc)
    }
}

额外注意点

  • 图标规范:任务视图图标要简洁,因为系统会根据当前主题(深色/浅色)调整显示效果,高对比度的单色图标适配性最好。
  • 兼容性:API26以下的系统会直接使用应用的主图标,无需额外处理兼容逻辑。
  • Facebook的实现逻辑:他们就是用了静态配置的方式,给主Activity指定了反色的taskIcon,所以任务视图里的图标和主图标样式、颜色相反。

内容的提问来源于stack exchange,提问作者hysabone.com

火山引擎 最新活动