ActivityManager(3)—clearApplicationUserData()

ActivityManager:clearApplicationUserData()

1.作用

用于应用清除用户数据,相当于在设置中清除应用数据,但是不卸载该应用。

2.源码

  public boolean clearApplicationUserData() {
        return clearApplicationUserData(mContext.getPackageName(), null);
    }
  public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
        try {
            return ActivityManagerNative.getDefault().clearApplicationUserData(packageName, 
                    observer, UserHandle.myUserId());
        } catch (RemoteException e) {
            return false;
        }
    }

3.分析及说明

我们来关注一下核心的代码
 return ActivityManagerNative.getDefault().clearApplicationUserData(packageName,observer, UserHandle.myUserId());
阅读过Android源码的同学肯定知道ActivityManager的大多数功能都是调用了ActivityManagerNative类接口来完成的,因此,我们寻迹来看ActivityManagerNative的代码,查看clearApplicationUserData()方法的实现。
  public boolean clearApplicationUserData(final String packageName,
        final IPackageDataObserver observer, final int userId) throws RemoteException {
    Parcel data = Parcel.obtain();
    Parcel reply = Parcel.obtain();
    data.writeInterfaceToken(IActivityManager.descriptor);
    data.writeString(packageName);
    data.writeStrongBinder((observer != null) ? observer.asBinder() : null);
    data.writeInt(userId);
    mRemote.transact(CLEAR_APP_DATA_TRANSACTION, data, reply, 0);
    reply.readException();
    boolean res = reply.readInt() != 0;
    data.recycle();
    reply.recycle();
    return res;
}
其中参数:packageName:是需要被清除数据的应用的包名
         observer   :是应用的数据观察者
         userId     :开发者ID
Parcel就是一个存放读取数据的容器, Android系统中的binder进程间通信(IPC)就使用了Parcel类来进行客户端与服务端数据的交互,而且AIDL的数据也是通过Parcel来交互的,用Parcel来储存参数。

mRemote.transact(...)方法执行CLEAR_APP_DATA_TRANSACTION清除数据操作,它会导致ActivityManagerService的onTransact(...)方法被调用:
 public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
        throws RemoteException {
    switch (code) {
    ...
    case FINISH_ACTIVITY_TRANSACTION: {
        data.enforceInterface(IActivityManager.descriptor);
        IBinder token = data.readStrongBinder();
        Intent resultData = null;
        int resultCode = data.readInt();
        if (data.readInt() != 0) {
            resultData = Intent.CREATOR.createFromParcel(data);
        }
        boolean finishTask = (data.readInt() != 0);
        boolean res = finishActivity(token, resultCode, resultData, finishTask);
        reply.writeNoException();
        reply.writeInt(res ? 1 : 0);
        return true;
    }
    ...
}
reply读取了onTransact(...)返回的true,当res为true,则返回到ActivityManager的clearApplicationUserData()返回值为true,则数据清除成功。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值