[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);
目录
相关文章
|
4月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
468 4
|
4月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
1月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
56 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
6月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
76 2
|
3月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
127 11
|
4月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
141 21
|
5月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
154 15
Android 系统缓存扫描与清理方法分析
|
3月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
59 8
|
4月前
|
Linux Android开发 iOS开发
深入探索Android与iOS的多任务处理机制
在移动操作系统领域,Android和iOS各有千秋,尤其在多任务处理上展现出不同的设计理念和技术实现。本文将深入剖析两大平台在后台管理、资源分配及用户体验方面的策略差异,揭示它们如何平衡性能与电池寿命,为用户带来流畅而高效的操作体验。通过对比分析,我们不仅能够更好地理解各自系统的工作机制,还能为开发者优化应用提供参考。
|
4月前
|
算法 Linux 调度
深入探索安卓系统的多任务处理机制
【10月更文挑战第21天】 本文旨在为读者提供一个关于Android系统多任务处理机制的全面解析。我们将从Android操作系统的核心架构出发,探讨其如何管理多个应用程序的同时运行,包括进程调度、内存管理和电量优化等方面。通过深入分析,本文揭示了Android在处理多任务时所面临的挑战以及它如何通过创新的解决方案来提高用户体验和设备性能。
107 1

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    Android实战经验之Kotlin中快速实现MVI架构
  • 10
    即时通讯安全篇(一):正确地理解和使用Android端加密算法