[Android]任务列表中显示"小程序"的原理分析

简介: 谈谈微信是怎么实现在任务列表中显示"小程序"的.

今天被小程序刷屏了^^ 我也来凑凑热闹.
谈谈微信是怎么实现在任务列表中显示"小程序"的.

效果

微信中打开了"滴滴(小程序)"后,
可以看到,任务列表不仅显示了"微信", 还显示了"滴滴(小程序)"的人口.
通过这个入口,就可以很方面的切换小程序了, 体验和原生程序也一样一样的.

分析

下面简单分析一下他的实现.

1.Android系统中,显示最近程序列表的View是 RecentsPanelView.
他通过refreshRecentTasksList()加载程序列表,我们来看看代码:
可以看到RecentTasksLoader mRecentTasksLoader负责真正处理数据加载.

RecentsPanelView.java

private RecentTasksLoader mRecentTasksLoader;  

* * *  

private void refreshRecentTasksList(
    ArrayList<TaskDescription> recentTasksList, boolean firstScreenful) {
    if (mRecentTaskDescriptions == null && recentTasksList != null){
      onTasksLoaded(recentTasksList, firstScreenful);
    } else {
      //加载最近的列表
      mRecentTasksLoader.loadTasksInBackground();
    }
  }

2.顺着看看RecentTasksLoader的实现:

这里可以清楚看到,加载的数据是`ActivityManager.getRecentTasks()`. 
也就是说显示的是Task列表.

RecentTasksLoader.java

 ArrayList<TaskDescription>  getRecentTasks() {
       cancelLoadingThumbnails();

       ArrayList<TaskDescription> tasks = new ArrayList<TaskDescription>();
       final PackageManager pm = mContext.getPackageManager();
       final ActivityManager am = (ActivityManager)
               mContext.getSystemService(Context.ACTIVITY_SERVICE);

       //获取最近的Task
       final List<ActivityManager.RecentTaskInfo> recentTasks =
               am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);

      * * *  
       return tasks;
   }

__到这里,已经很清楚了. 要显示"小程序"入口, 只需要新建一个Task启动就好了~
是不是很简单啊.__

来来来验证一下我们的想法.
这里使用 adb shell dumpsys activity activities查看一下Task状态

1. 只开启微信

2. 开启小程序

如下图所示, 微信新开启了一个.AppBrandUI的task栈

实现

知道原理,实现就很简单了.

假设小程序的Activity是 TaskTestActivity,整个实现分两步:

1. AndroidManifest.xml中为Activity设置taskAffinity
<activity
        android:icon="@drawable/didi"
        android:name=".TaskTestActivity"
        android:label="小程序测试"
        android:taskAffinity=".NewTask" />    
2. 以NEW_TASK方式启动Activity
    //以Intent.FLAG_ACTIVITY_NEW_TASK方式启动Activity
    Intent intent = new Intent(this, TaskTestActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
为什么要设置taskAffinity呢,

这和FLAG_ACTIVITY_NEW_TASK的特性有关:

FLAG_ACTIVITY_NEW_TASK: 设置此状态,首先会查找是否存在和被启动的Activity具有相同的taskAffinity的task(注意同一个应用程序中默认所有activity 的taskAffinity是一样的),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity.

也就是说,如果App已经启动,即使用FLAG_ACTIVITY_NEW_TASK新起Activity, 因为taskAffinity相同,也会被压到一个task中, 自然recent panel 就看不到两个入口了.

所以我们需要为小程序设置一个新的taskAffinity

下面是demo效果

拓展

让自己的程序不显示在任务列表中

有时候我们做一个工具, 或者后台界面, 不希望显示在程序列表中.
也很简单,只要设置task的属性就好了

方法1:

在AndroidManifest.xml设置Activity的 android:excludeFromRecents为true

<activity
      android:excludeFromRecents="true"
      android:icon="@drawable/didi"
      android:name=".TaskTestActivity"
      android:label="小程序测试" />
方法2:

在启动Activity的时候加上Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS FLAG

//Activity不显示在recent列表中.
Intent intent = new Intent(this, TaskTestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(intent);
目录
相关文章
|
22天前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS无疑是两大主角。它们各自拥有独特的开发环境、工具集和生态系统。本文深入探讨了这两个平台的开发环境,从编程语言、IDE到模拟器的使用,再到市场覆盖度和用户群体差异。通过比较,旨在为开发者提供选择合适平台的参考依据,并引发对如何优化跨平台开发策略的进一步思考。
27 0
|
4天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的大舞台上,安卓与iOS两大操作系统各占半壁江山。本文将深入浅出地比较两者的开发环境,从开发工具、编程语言到用户界面设计等多个维度进行剖析,旨在为初入行的开发者们提供一盏明灯,帮助他们选择适合自己的开发路径。通过实例分析和数据支持,我们将揭示这两个平台的独特优势和潜在挑战,以及它们如何影响应用的性能和用户体验。
11 1
|
12天前
|
开发框架 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第7天】在移动应用开发的广阔天地中,安卓和iOS两大平台各据一方。本文将深入探讨这两个平台的异同,从开发环境、工具支持到市场定位等方面进行比较。我们将不涉及具体的代码示例,而是聚焦于开发生态的宏观视角,为即将踏入这一领域的开发者提供一个全面的视角。
42 6
|
13天前
|
Android开发 Swift iOS开发
安卓与iOS开发环境的差异性分析
【8月更文挑战第6天】在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文将深入探讨这两个操作系统在开发环境方面的主要差异,从编程语言、工具框架到开发成本等多个维度进行比较。通过分析,旨在为开发者提供一个清晰的平台选择指导,帮助他们根据项目需求和个人偏好做出更明智的决策。
41 5
|
11天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文通过浅显的语言和直观的比喻,探讨了这两大操作系统在开发环境上的差异与特点,旨在为初入行的开发者们提供一个清晰的指南。我们将从开发工具、编程语言、用户界面设计以及生态系统四个方面进行比较,帮助读者理解每个平台的优势与局限。
|
12天前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的大潮中,安卓和iOS两大平台各自展现出独特的开发环境和生态系统。本文将从开发者的角度出发,深入探讨这两个平台在编程语言、开发工具、用户界面设计以及市场分布等方面的不同特点。通过比较分析,旨在为移动应用开发者提供一份实用的参考,帮助他们在项目初期做出更加明智的平台选择。
|
12天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS平台如同双子星座般耀眼。本文将深入探讨这两大操作系统的开发环境,从语言、工具到生态系统,揭示它们的独特魅力与挑战。通过比较,我们不仅能更清晰地看到各自的特点,还能理解开发者如何在这两个平台上进行高效工作。无论你是安卓的忠实拥趸还是iOS的狂热粉丝,这篇文章都将为你提供一个全面的视角,让你对移动应用开发有更深的认识。
24 1
|
14天前
|
Java 开发工具 Android开发
安卓与iOS开发环境的差异性分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文深入探讨了这两个平台在开发环境上的主要差异,从编程语言、开发工具到用户界面设计等多个维度进行比较。旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。通过实际案例分析,揭示各自平台的独有优势和可能面临的挑战,从而让读者能够更加全面地理解两大系统在移动开发领域的竞争与合作。
28 3
|
14天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,它们各自拥有独特的开发环境。本文将深入探讨这两种平台的开发环境,从编程语言、工具、集成开发环境(IDE)到用户界面设计等方面进行比较。我们旨在揭示两者的异同点,并试图理解这些差异如何影响开发者的选择和应用的性能。通过实例分析,我们将探索如何在不同的环境下优化开发流程,以期为开发者提供实用的指导。
|
16天前
|
移动开发 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS是两大主导力量。它们各自拥有独特的开发环境和工具,这些差异深刻影响着开发者的决策与应用的性能。本文将深入探讨这两个平台的开发环境,通过比较它们的编程语言、开发工具、用户界面设计及生态系统支持,揭示它们各自的优势与局限。我们旨在为即将踏入移动开发领域的新手提供一个清晰的指南,并激发对移动开发更深层次探索的兴趣。