本篇博客主要以Android O的代码为例,分析一下清除应用数据的流程。
一、UI部分
从手机的设置界面进入到应用管理界面,选中某个应用后,可以看到清除数据的按键。
按键对应的代码定义于AppStorageSettings.java中。
界面加载时的代码如下:
private void setupViews() {
...........
//初始化对应的按键
mClearDataButton = (Button) ((LayoutPreference) findPreference(KEY_CLEAR_DATA)).findViewById(R.id.button);
...........
}
点击mClearDataButton后的处理逻辑如下:
@Override
public void onClick(View v) {
............
} else if (v == mClearDataButton) {
if (mAppsControlDisallowedAdmin != null && !mAppsControlDisallowedBySystem) {
............
} else if (mAppEntry.info.manageSpaceActivityName != null) {
............
} else {
//弹出清除数据的对话框
showDialogInner(DLG_CLEAR_DATA, 0);
}
}...........
............
}
接着看看创建对话框的部分:
@Override
protected AlertDialog createDialog(int id, int errorCode) {
switch (id) {
case DLG_CLEAR_DATA:
return new AlertDialog.Builder(getActivity())
.setTitle(getActivity().getText(R.string.clear_data_dlg_title))
.setMessage(getActivity().getText(R.string.clear_data_dlg_text))
.setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Clear user data here
initiateClearUserData();
}
})
.setNegativeButton(R.string.dlg_cancel, null)
.create();
case DLG_CANNOT_CLEAR_DATA:
............
}
return null;
}
容易看出,一旦点击确定按键后,将会调用initiateClearUserData函数:
private void initiateClearUserData() {
mClearDataButton.setEnabled(false);
// Invoke uninstall or clear user data based on sysPackage
String packageName = mAppEntry.info.packageName;
Log.i(TAG, "Clearing user data for package : " + packageName);
if (mClearDataObserver == null) {
//这里创建的是AppStorageSettings的内部类,用于清除数据后回调
mClearDataObserver = new ClearUserDataObserver();
}
ActivityManager am = (ActivityManager)
getActivity().getSystemService(Context.ACTIVITY_SERVICE);
//调用ActivityManager的clearApplicationUserData函数
boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
if (!res) {
// Clearing data failed for some obscure reason. Just log error for now
Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
} else {
mClearDataButton.setText(R.string.recompute_size);
}
}
二、AMS部分
UI部分结束后,我们看看AMS相关的逻辑:
ActivityManager中的clearApplicationUserData函数:
public boolean clearApplicationUserData(