ActivityManager(3)—clearApplicationUserData()

    xiaoxiao2026-06-21  0

    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,则数据清除成功。
    转载请注明原文地址: https://ju.6miu.com/read-1310747.html
    最新回复(0)