LegacyPackageDeleteObserver----Android中的变态设计

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

mLegacyLegacyPackageDeleteObserver(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);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值