Android中的一个变态设计。
卸载应用的时候,客户端调用getPackageManager()的deletePackageAsUser方法
@Override
public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
deletePackageAsUser(packageName, observer, flags, mContext.getUserId());
}
@Override
public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
int userId) {
try {
mPM.deletePackageAsUser(packageName, observer, userId, flags);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
通过binder通信,会调用到PMS中的deletePackageAsUser方法
@Override
public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int userId,
int flags) {
deletePackage(packageName, new LegacyPackageDeleteObserver(observer).getBinder(), userId,
flags);
}
@Override
public void deletePackage(final String packageName,
final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.DELETE_PACKAGES, null);
Preconditions.checkNotNull(packageName);
… …
try {
observer.onPackageDeleted(packageName,
PackageManager.DELETE_FAILED_USER_RESTRICTED, null);
} catch (RemoteException re) {
}
这里的调用设计非常的变态,observer是一个binder对象,用来进行回调操作。
LegacyPackageDeleteObserver的定义
/** {@hide} */
public static class LegacyPackageDeleteObserver extends PackageDeleteObserver {
private final IPackageDeleteObserver mLegacy;
public LegacyPackageDeleteObserver(IPackageDeleteObserver legacy) {
mLegacy = legacy;
}
@Override
public void onPackageDeleted(String basePackageName, int returnCode, String msg) {
if (mLegacy == null) return;
try {
mLegacy.packageDeleted(basePackageName, returnCode);
} catch (RemoteException ignored) {
}
}
}
继承于PackageDeleteObserver类
public class PackageDeleteObserver {
private final IPackageDeleteObserver2.Stub mBinder = new IPackageDeleteObserver2.Stub() {
@Override
public void onUserActionRequired(Intent intent) {
PackageDeleteObserver.this.onUserActionRequired(intent);
}
@Override
public void onPackageDeleted(String basePackageName, int returnCode, String msg) {
PackageDeleteObserver.this.onPackageDeleted(basePackageName, returnCode, msg);
}
};
/** {@hide} */
public IPackageDeleteObserver2 getBinder() {
return mBinder;
}
public void onUserActionRequired(Intent intent) {
}
public void onPackageDeleted(String basePackageName, int returnCode, String msg) {
}
}
在deletePackageAsUser方法中,通过LegacyPackageDeleteObserver(observer).getBinder()操作,得到IPackageDeleteObserver2类型的参数mBinder,这是一个匿名类对象,在deletePackage方法中,其onPackageDeleted方法被调用后,将调用PackageDeleteObserver.this.onPackageDeleted方法,即LegacyPackageDeleteObserver类的onPackageDeleted方法,即
public void onPackageDeleted(String basePackageName, int returnCode, String msg) {
if (mLegacy == null) return;
try {
mLegacy.packageDeleted(basePackageName, returnCode);
} catch (RemoteException ignored) {
}
}
然后调用 mLegacy.packageDeleted(basePackageName, returnCode);
mLegacy为LegacyPackageDeleteObserver(observer)操作是传入的IPackageDeleteObserver observer对象,回调方法还是使用的IPackageDeleteObserver observer对象的方法。这样转来转去的引入IPackageDeleteObserver2却没有明显的使用,有什么意义呢?
我只想说一句,变态。
IPackageDeleteObserver2定义
package android.content.pm;
/** {@hide} */
public interface IPackageDeleteObserver2 extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements android.content.pm.IPackageDeleteObserver2
{
private static final java.lang.String DESCRIPTOR = "android.content.pm.IPackageDeleteObserver2";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}