android 进lanucher的广播,Android M Launcher3监听packages变化实现过程

本文详细分析了Android M及更高版本的Launcher3如何监听应用程序包的变化。从L版本开始,监听方式从PackageChangedReceiver转变为通过ILauncherApps接口和系统服务LauncherApps来实现。当监听到包变化时,通过回调OnAppsChangedListener来处理图标添加、删除等操作。整个过程涉及到AIDL、BroadcastReceiver和Handler的交互。
摘要由CSDN通过智能技术生成

前言

android L开始launcher3对于package变化的监听发生了改变,M之前都是通过PackageChangedReceiver(PackageChangedReceiver.java)这个广播接收器来监听的。但是从L开始我们发现LauncherAppsCompat的实现类有两个:LauncherAppsCompatV16和LauncherAppsCompatVL。在LauncherAppsCompatV16中还是通过广播(PackageMonitor extends BroadcastReceiver)来监听packages变化。而在 LauncherAppsCompatVL并没有发现有广播接收器,那么它到底是如何实现packages的监听的呢?

LauncherApps的初始化

我们看到在LauncherAppsCompatVL初始化时,通过getSystemService("launcherapps")得到一个mLauncherApps的系统服务。代码如下:

LauncherAppsCompatVL(Context context) {

super();

mLauncherApps = (LauncherApps) context.getSystemService("launcherapps");

}

看到getSystemService我们可以知道mLauncherApps是一个系统服务,那这个系统服务到底是何方神圣呢?

LauncherApps.java位于frameworks/base/core/java/android/content/pm目录下,我们首先看下它的初始化。

public LauncherApps(Context context, ILauncherApps service) {

mContext = context;

mService = service;

mPm = context.getPackageManager();

}

在LauncherApps的构造方法中重要做三个初始化:上下文mContext、ILauncherApps及获取PackageManager对象。我们重点关注mService是如何实现的,它是如何做到package的监听的呢?

ILauncherApps的实现

从上文我们可以知道LauncherApps是作为客户端通过ILauncherApps获取服务端package变化状态,那么ILauncherApps这个接口定义了些什么呢,它又是如何实现对package的监听呢?我们继续往下分析,首先看下ILauncherApps定义了什么方法:

interface ILauncherApps {

void addOnAppsChangedListener(in IOnAppsChangedListener listener);

void removeOnAppsChangedListener(in IOnAppsChangedListener listener);

List getLauncherActivities(String packageName, in UserHandle user);

ResolveInfo resolveActivity(in Intent intent, in UserHandle user);

void startActivityAsUser(in ComponentName component, in Rect sourceBounds,

in Bundle opts, in UserHandle user);

void showAppDetailsAsUser(in ComponentName component, in Rect sourceBounds,

in Bundle opts, in UserHandle user);

boolean isPackageEnabled(String packageName, in UserHandle user);

boolean isActivityEnabled(in ComponentName component, in UserHandle user);

}

我们看到在这个接口中有addOnAppsChangedListener和removeOnAppsChangedListener这两个方法及其他一些方法(我们暂时不关心),我们只关心addOnAppsChangedListener和removeOnAppsChangedListener这两个方法,通过名字我们可以猜测这应该就是我们要找的package监听器的添加和删除方法

。那么接下来我们来看下ILauncherApps接口的实现。其实现类LauncherAppsImpl是在LauncherAppsService的内部类,代码路径是frameworks/base/services/core/java/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值