今天被小程序刷屏了^^ 我也来凑凑热闹.
谈谈微信是怎么实现在任务列表中显示"小程序"的.
微信中打开了"滴滴(小程序)"后,
可以看到,任务列表不仅显示了"微信", 还显示了"滴滴(小程序)"的人口.
通过这个入口,就可以很方面的切换小程序了, 体验和原生程序也一样一样的.
下面简单分析一下他的实现.
1.Android系统中,显示最近程序列表的View是 RecentsPanelView
.
他通过 refreshRecentTasksList()
加载程序列表,我们来看看代码:
可以看到 RecentTasksLoader mRecentTasksLoader
负责真正处理数据加载.
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列表.
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状态
如下图所示, 微信新开启了一个.AppBrandUI的task栈
知道原理,实现就很简单了.
假设小程序的Activity是 TaskTestActivity,整个实现分两步:
<activity android:icon="@drawable/didi" android:name=".TaskTestActivity" android:label="小程序测试" android:taskAffinity=".NewTask" />
//以Intent.FLAG_ACTIVITY_NEW_TASK方式启动Activity Intent intent = new Intent(this, TaskTestActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
这和 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
有时候我们做一个工具, 或者后台界面, 不希望显示在程序列表中.
也很简单,只要设置task的属性就好了
在AndroidManifest.xml设置Activity的 android:excludeFromRecents
为true
<activity android:excludeFromRecents="true" android:icon="@drawable/didi" android:name=".TaskTestActivity" android:label="小程序测试" />
在启动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);
2019-03-21 17:28:12 2668
2019-03-21 17:27:07 2949
2019-03-21 17:25:57 3047
2019-03-21 17:24:53 2953
2019-03-21 17:23:46 3022
公司正在筹划上市,为扩大市场占有率,将在近3个月内每日赠送6个免费服务名额。
今日仅剩下2个免费名额
关于微信小程序web-view组件内嵌h5的具体配置流程
目前, 微信 小程序 开发 呈现出 持续火热 的状态 ,越来越多的商家开始关注并开发自己的小程序, 但是,我们也看到,还有一部分的 商家 持观望的态度,不知道是...
微信小程序 对于许多企业的发展是有助力作用的,因此,现在 许多公司在小程序出现已经开始申请自己的账号,一些提前开始运营 微信小程序 的公司已经取得了不错的成绩,...
了解大连的微信公众号代运营价格,花最少钱干最多事
现在, 微信小程序 成为了企业在进行微信营销时又一个有效的方式,许多企业通过 微信小程序 开发的方式建立起微信上的营销覆盖网络,但是,有些企业在开发小程序之后,...
关于微信小程序web-view组件内嵌h5的具体配置流程
目前, 微信 小程序 开发 呈现出 持续火热 的状态 ,越来越多的商家开始关注并开发自己的小程序, 但是,我们也看到,还有一部分的 商家 持观望的态度,不知道是...
微信小程序 对于许多企业的发展是有助力作用的,因此,现在 许多公司在小程序出现已经开始申请自己的账号,一些提前开始运营 微信小程序 的公司已经取得了不错的成绩,...
了解大连的微信公众号代运营价格,花最少钱干最多事
现在, 微信小程序 成为了企业在进行微信营销时又一个有效的方式,许多企业通过 微信小程序 开发的方式建立起微信上的营销覆盖网络,但是,有些企业在开发小程序之后,...
任务列表中显示"小程序"的原理分析