先看看PackageMonitor的基本定义:
package com.android.internal.content;
/**
* Helper class for monitoring the state of packages: adding, removing,
* updating, and disappearing and reappearing on the SD card.
*/
public abstract class PackageMonitor extends android.content.BroadcastReceiver
static {
sPackageFilt.addAction(Intent.ACTION_PACKAGE_ADDED);
sPackageFilt.addAction(Intent.ACTION_PACKAGE_REMOVED);
sPackageFilt.addAction(Intent.ACTION_PACKAGE_CHANGED);
sPackageFilt.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
sPackageFilt.addAction(Intent.ACTION_PACKAGE_RESTARTED);
sPackageFilt.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
sPackageFilt.addDataScheme("package");
sNonDataFilt.addAction(Intent.ACTION_UID_REMOVED);
sNonDataFilt.addAction(Intent.ACTION_USER_STOPPED);
sNonDataFilt.addAction(Intent.ACTION_PACKAGES_SUSPENDED);
sNonDataFilt.addAction(Intent.ACTION_PACKAGES_UNSUSPENDED);
sExternalFilt.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
sExternalFilt.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
}
可以看到PackageMonitor是一个内部API,并且它实际上是一个BroadcastReceiver,在框架内部注册了接收上述Action的Intent广播。虽然目前没有对第三方App开放,但其设计思想可以借鉴,毕竟注册各种Package相关的Intent比较琐碎,在一个工程中封装一个类似的Monitor作为基本框架模块供复用很有必要。PackageMonitor的主要工作是将注册/解析Intent广播封装,对外暴露成需要实现的有语义的回调。看一下他的注册和有代表性的回调。
(1)注册