Android O :清除应用数据

本篇博客主要以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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值