博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]任务列表中显示"小程序"的原理分析
阅读量:5965 次
发布时间:2019-06-19

本文共 2595 字,大约阅读时间需要 8 分钟。

今天被小程序刷屏了^^ 我也来凑凑热闹.

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

效果

微信中打开了"滴滴(小程序)"后,

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

分析

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

1.Android系统中,显示最近程序列表的View是 RecentsPanelView.

他通过refreshRecentTasksList()加载程序列表,我们来看看代码:
可以看到RecentTasksLoader mRecentTasksLoader负责真正处理数据加载.

RecentsPanelView.java

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

2.顺着看看RecentTasksLoader的实现:

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

RecentTasksLoader.java

ArrayList
getRecentTasks() { cancelLoadingThumbnails(); ArrayList
tasks = new ArrayList
(); final PackageManager pm = mContext.getPackageManager(); final ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); //获取最近的Task final List
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
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

方法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);

转载地址:http://bjxax.baihongyu.com/

你可能感兴趣的文章
Ubuntu配置和修改IP地址
查看>>
mysql__CASE WHEN进行字符串替换处理
查看>>
Android手机安全性测试手段
查看>>
规则执行管理平台中远程和服务管理的学习1
查看>>
Jvm工作原理学习笔记(转)
查看>>
线程池的拒绝策略(重要)
查看>>
Windows系统下SSH客户端连接阿里云Linux服务器
查看>>
db2 日期处理
查看>>
树莓派3B+ (PPOE+hostapd)变身无线路由器
查看>>
我的友情链接
查看>>
javascript的规范
查看>>
程序中减少使用if语句的方法集锦
查看>>
struts2 在线用户记录
查看>>
Eclipse常用快捷键
查看>>
mount error 12 = Cannot allocate memory
查看>>
Spring工作原理详解
查看>>
Protobuf动态解析那些事儿
查看>>
浮点数:一种有漏洞的抽象【译】
查看>>
mysql修改初始密码
查看>>
Android TextView 使用替换构建出不同样式的字符串
查看>>