1、Settings中点击重置选项后进入的布局如下

packages/apps/Settings/res/xml/reset_dashboard_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"android:title="@string/reset_dashboard_title"android:key="reset_dashboard_fragment_screen"><!-- Network reset --><com.android.settingslib.RestrictedPreferenceandroid:key="network_reset_pref"android:title="@string/reset_network_title"settings:userRestriction="no_network_reset"settings:useAdminDisabledSummary="true"android:fragment="com.android.settings.ResetNetwork" /><!-- Reset app preferences --><Preferenceandroid:key="reset_app_prefs"android:title="@string/reset_app_preferences" /><!-- Factory reset --><com.android.settingslib.RestrictedPreferenceandroid:key="factory_reset"android:title="@string/master_clear_title"settings:keywords="@string/keywords_factory_data_reset"settings:userRestriction="no_factory_reset"settings:useAdminDisabledSummary="true"android:fragment="com.android.settings.MasterClear" />
</PreferenceScreen>

2、如下是重置应用的逻辑处理

packages/apps/Settings/src/com/android/settings/applications/ResetAppPrefPreferenceController.java
package com.android.settings.applications;import android.content.Context;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.text.TextUtils;import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnCreate;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;public class ResetAppPrefPreferenceController extends AbstractPreferenceControllerimplements PreferenceControllerMixin, LifecycleObserver, OnCreate, OnSaveInstanceState {privat ResetAppsHelper mResetAppsHelper;//ResetAppsHelper的是重点逻辑处理public ResetAppPrefPreferenceController(Context context, Lifecycle lifecycle) {super(context);mResetAppsHelper = new ResetAppsHelper(context);if (lifecycle != null) {lifecycle.addObserver(this);}}@Overridepublic boolean handlePreferenceTreeClick(Preference preference) {if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {return false;}mResetAppsHelper.buildResetDialog();return true;}@Overridepublic boolean isAvailable() {return true;}@Overridepublic String getPreferenceKey() {return "reset_app_prefs";}@Overridepublic void onCreate(Bundle savedInstanceState) {mResetAppsHelper.onRestoreInstanceState(savedInstanceState);}@Overridepublic void onSaveInstanceState(Bundle outState) {mResetAppsHelper.onSaveInstanceState(outState);}
}

3、packages/apps/Settings/src/com/android/settings/applications/ResetAppsHelper.java

/** Copyright (C) 2015 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
package com.android.settings.applications;import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.app.INotificationManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.net.NetworkPolicyManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.webkit.IWebViewUpdateService;import com.android.settings.R;import java.util.List;public class ResetAppsHelper implements DialogInterface.OnClickListener,DialogInterface.OnDismissListener {private static final String EXTRA_RESET_DIALOG = "resetDialog";private final PackageManager mPm;private final IPackageManager mIPm;private final INotificationManager mNm;private final IWebViewUpdateService mWvus;private final NetworkPolicyManager mNpm;private final AppOpsManager mAom;private final Context mContext;private AlertDialog mResetDialog;public ResetAppsHelper(Context context) {mContext = context;mPm = context.getPackageManager();mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));mNm = INotificationManager.Stub.asInterface(ServiceManager.getService(Context.NOTIFICATION_SERVICE));mWvus = IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));mNpm = NetworkPolicyManager.from(context);mAom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);}public void onRestoreInstanceState(Bundle savedInstanceState) {if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {buildResetDialog();}}public void onSaveInstanceState(Bundle outState) {if (mResetDialog != null) {outState.putBoolean(EXTRA_RESET_DIALOG, true);}}public void stop() {if (mResetDialog != null) {mResetDialog.dismiss();mResetDialog = null;}}void buildResetDialog() {if (mResetDialog == null) {mResetDialog = new AlertDialog.Builder(mContext).setTitle(R.string.reset_app_preferences_title).setMessage(R.string.reset_app_preferences_desc).setPositiveButton(R.string.reset_app_preferences_button, this).setNegativeButton(R.string.cancel, null).setOnDismissListener(this).show();}}@Overridepublic void onDismiss(DialogInterface dialog) {if (mResetDialog == dialog) {mResetDialog = null;}}@Overridepublic void onClick(DialogInterface dialog, int which) {if (mResetDialog != dialog) {return;}AsyncTask.execute(new Runnable() {@Overridepublic void run() {List<ApplicationInfo> apps = mPm.getInstalledApplications(PackageManager.GET_DISABLED_COMPONENTS);for (int i = 0; i < apps.size(); i++) {ApplicationInfo app = apps.get(i);try {mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);} catch (android.os.RemoteException ex) {}if (!app.enabled) {if (mPm.getApplicationEnabledSetting(app.packageName)== PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER&& !isNonEnableableFallback(app.packageName)) {mPm.setApplicationEnabledSetting(app.packageName,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,PackageManager.DONT_KILL_APP);}}}try {mIPm.resetApplicationPreferences(UserHandle.myUserId());} catch (RemoteException e) {}mAom.resetAllModes();final int[] restrictedUids = mNpm.getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND);final int currentUserId = ActivityManager.getCurrentUser();for (int uid : restrictedUids) {// Only reset for current userif (UserHandle.getUserId(uid) == currentUserId) {mNpm.setUidPolicy(uid, POLICY_NONE);}}}});}private boolean isNonEnableableFallback(String packageName) {try {return mWvus.isFallbackPackage(packageName);} catch (RemoteException e) {throw new RuntimeException(e);}}
}

4、packages/apps/Settings/res/layout/master_clear.xml

   <Buttonandroid:id="@+id/initiate_master_clear"android:layout_gravity="center_horizontal"android:layout_marginTop="20dip"android:layout_marginBottom="12dip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/master_clear_button_text"android:gravity="center" />

5、packages/apps/Settings/src/com/android/settings/MasterClear.java

mInitiateButton = (Button) mContentView.findViewById(R.id.initiate_master_clear);
mInitiateButton.setOnClickListener(mInitiateListener);
protected final Button.OnClickListener mInitiateListener = new Button.OnClickListener() {public void onClick(View view) {final Context context = view.getContext();if (Utils.isDemoUser(context)) {final ComponentName componentName = Utils.getDeviceOwnerComponent(context);if (componentName != null) {final Intent requestFactoryReset = new Intent().setPackage(componentName.getPackageName()).setAction(Intent.ACTION_FACTORY_RESET);context.startActivity(requestFactoryReset);}/*SPRD added for bug 692488, pop a dialog when low battery */} else if (mLevelpower < POWER_LIMIT) {mIsDialogShow = true;dialog();} else if (!runKeyguardConfirmation(KEYGUARD_REQUEST)) {showFinalConfirmation();}}};

6、packages/apps/Settings/res/layout/master_clear_confirm.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/master_clear_confirm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="12dp"android:layout_marginEnd="12dp"android:layout_marginTop="12dp"android:textSize="20sp"android:text="@string/master_clear_final_desc" /><Button android:id="@+id/execute_master_clear"android:layout_gravity="center_horizontal"android:layout_marginTop="40dip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/master_clear_final_button_text"android:gravity="center" /></LinearLayout>

7、packages/apps/Settings/src/com/android/settings/MasterClearConfirm.java

 private void establishFinalConfirmationState() {mContentView.findViewById(R.id.execute_master_clear).setOnClickListener(mFinalClickListener);}private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {public void onClick(View v) {if (Utils.isMonkeyRunning()) {return;}final PersistentDataBlockManager pdbManager = (PersistentDataBlockManager)getActivity().getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);final OemLockManager oemLockManager = (OemLockManager)getActivity().getSystemService(Context.OEM_LOCK_SERVICE);if (pdbManager != null && !oemLockManager.isOemUnlockAllowed() &&Utils.isDeviceProvisioned(getActivity())) {// if OEM unlock is allowed, the persistent data block will be wiped during FR// process. If disabled, it will be wiped here, unless the device is still being// provisioned, in which case the persistent data block will be preserved.new AsyncTask<Void, Void, Void>() {int mOldOrientation;ProgressDialog mProgressDialog;@Overrideprotected Void doInBackground(Void... params) {pdbManager.wipe();return null;}@Overrideprotected void onPostExecute(Void aVoid) {mProgressDialog.hide();if (getActivity() != null) {getActivity().setRequestedOrientation(mOldOrientation);doMasterClear();}}@Overrideprotected void onPreExecute() {mProgressDialog = getProgressDialog();mProgressDialog.show();// need to prevent orientation changes as we're about to go into// a long IO request, so we won't be able to access inflate resources on flashmOldOrientation = getActivity().getRequestedOrientation();getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);}}.execute();} else {doMasterClear();}}private ProgressDialog getProgressDialog() {final ProgressDialog progressDialog = new ProgressDialog(getActivity());progressDialog.setIndeterminate(true);progressDialog.setCancelable(false);progressDialog.setTitle(getActivity().getString(R.string.master_clear_progress_title));progressDialog.setMessage(getActivity().getString(R.string.master_clear_progress_text));return progressDialog;}};

8、frameworks/base/services/core/java/com/android/server/MasterClearReceiver.java

public class MasterClearReceiver extends BroadcastReceiver {private static final String TAG = "MasterClear";private boolean mWipeExternalStorage;private boolean mWipeEsims;@Overridepublic void onReceive(final Context context, final Intent intent) {if (intent.getAction().equals(Intent.ACTION_REMOTE_INTENT)) {if (!"google.com".equals(intent.getStringExtra("from"))) {Slog.w(TAG, "Ignoring master clear request -- not from trusted server.");return;}}if (Intent.ACTION_MASTER_CLEAR.equals(intent.getAction())) {Slog.w(TAG, "The request uses the deprecated Intent#ACTION_MASTER_CLEAR, "+ "Intent#ACTION_FACTORY_RESET should be used instead.");}if (intent.hasExtra(Intent.EXTRA_FORCE_MASTER_CLEAR)) {Slog.w(TAG, "The request uses the deprecated Intent#EXTRA_FORCE_MASTER_CLEAR, "+ "Intent#EXTRA_FORCE_FACTORY_RESET should be used instead.");}final boolean shutdown = intent.getBooleanExtra("shutdown", false);final String reason = intent.getStringExtra(Intent.EXTRA_REASON);mWipeExternalStorage = intent.getBooleanExtra(Intent.EXTRA_WIPE_EXTERNAL_STORAGE, false);mWipeEsims = intent.getBooleanExtra(Intent.EXTRA_WIPE_ESIMS, false);final boolean forceWipe = intent.getBooleanExtra(Intent.EXTRA_FORCE_MASTER_CLEAR, false)|| intent.getBooleanExtra(Intent.EXTRA_FORCE_FACTORY_RESET, false);Slog.w(TAG, "!!! FACTORY RESET !!!");// The reboot call is blocking, so we need to do it on another thread.Thread thr = new Thread("Reboot") {@Overridepublic void run() {try {RecoverySystem.rebootWipeUserData(context, shutdown, reason, forceWipe, mWipeEsims);Log.wtf(TAG, "Still running after master clear?!");} catch (IOException e) {Slog.e(TAG, "Can't perform master clear/factory reset", e);} catch (SecurityException e) {Slog.e(TAG, "Can't perform master clear/factory reset", e);}}};if (mWipeExternalStorage || mWipeEsims) {// thr will be started at the end of this task.new WipeDataTask(context, thr).execute();} else {thr.start();}}private class WipeDataTask extends AsyncTask<Void, Void, Void> {private final Thread mChainedTask;private final Context mContext;private final ProgressDialog mProgressDialog;public WipeDataTask(Context context, Thread chainedTask) {mContext = context;mChainedTask = chainedTask;mProgressDialog = new ProgressDialog(context);}@Overrideprotected void onPreExecute() {mProgressDialog.setIndeterminate(true);mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);mProgressDialog.setMessage(mContext.getText(R.string.progress_erasing));mProgressDialog.show();}@Overrideprotected Void doInBackground(Void... params) {Slog.w(TAG, "Wiping adoptable disks");if (mWipeExternalStorage) {StorageManager sm = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);sm.wipeAdoptableDisks();}return null;}@Overrideprotected void onPostExecute(Void result) {mProgressDialog.dismiss();mChainedTask.start();}}
}

9、frameworks/base/core/java/android/os/RecoverySystem.java

 public static void rebootWipeUserData(Context context, boolean shutdown, String reason,boolean force, boolean wipeEuicc) throws IOException {UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);if (!force && um.hasUserRestriction(UserManager.DISALLOW_FACTORY_RESET)) {throw new SecurityException("Wiping data is not allowed for this user.");}final ConditionVariable condition = new ConditionVariable();Intent intent = new Intent("android.intent.action.MASTER_CLEAR_NOTIFICATION");intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);context.sendOrderedBroadcastAsUser(intent, UserHandle.SYSTEM,android.Manifest.permission.MASTER_CLEAR,new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {condition.open();}}, null, 0, null, null);// Block until the ordered broadcast has completed.condition.block();wipeEuiccData(context, wipeEuicc);String shutdownArg = null;if (shutdown) {shutdownArg = "--shutdown_after";}String reasonArg = null;if (!TextUtils.isEmpty(reason)) {reasonArg = "--reason=" + sanitizeArg(reason);}final String localeArg = "--locale=" + Locale.getDefault().toLanguageTag() ;bootCommand(context, shutdownArg, "--wipe_data", reasonArg, localeArg);}private static void bootCommand(Context context, String... args) throws IOException {LOG_FILE.delete();StringBuilder command = new StringBuilder();for (String arg : args) {if (!TextUtils.isEmpty(arg)) {command.append(arg);command.append("\n");}}// Write the command into BCB (bootloader control block) and boot from// there. Will not return unless failed.RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);rs.rebootRecoveryWithCommand(command.toString());throw new IOException("Reboot failed (no permissions?)");}

Android 8.1中Settings中恢复出厂设置流程相关推荐

  1. android 恢复出厂设置流程分析,基于Android系统快速恢复出厂设置方法实现.doc

    基于Android系统快速恢复出厂设置方法实现 基于Android系统快速恢复出厂设置方法实现 摘 要:针对使用Android系统的智能电视进行恢复出厂设置时重置速度慢的情况进行了研究和分析,从其重置 ...

  2. android 恢复出厂设置 界面,android恢复出厂设置流程概括

    恢复出厂设置流程概括 ============================================= 恢复出厂设置流程概括: 一. 设置模块中进行恢复出厂设置操作,系统一共做了两件事: 1 ...

  3. Android6.0 Reset恢复出厂设置流程分析

    点击Settings应用中的恢复出厂设置按钮后流程分析: 先使用grep命令搜索"恢复出厂设置"字符串,找到相应的布局文件: packages/apps/Settings/res/ ...

  4. 三星手机com.android.settings,三星手机恢复出厂设置方法【具体步骤】

    在当今智能终端界,无非是安卓和iOS两大阵营,微软移动终端的份额几乎可以被忽略,虽然安卓的份额比起iOS要高出许多,但要论系统的质量和用户体验度,iOS还是当之无愧的完美精品,这也就造成了安卓阵营总是 ...

  5. Android恢复出厂设置流程分析【Android源码解析十】

    最近看恢复出厂的一个问题,以前也查过这方面的流程,所以这里整理一些AP+framework层的流程: 在setting-->备份与重置--->恢复出厂设置--->重置手机---> ...

  6. android恢复出厂设置流程分析

    原文出自:http://blog.csdn.net/wdaming1986/article/details/11988531 最近看恢复出厂的一个问题,以前也查过这方面的流程,所以这里整理一些AP+f ...

  7. Android L集成新特性之恢复出厂设置保护之如何实现,类似苹果ID的远程控制功能

    在Android 5.0 以后以后的设备默认开启恢复出厂设置保护功能,主要是为了减少用户在丢失手机的带来的损失,比如手机上的一些照片和其他一些重要资料被偷盗者非法利用.此功能可以让用户可以通过谷歌账号 ...

  8. Android 如何才能捕获系统的恢复出厂设置事件

    点击恢复出厂设置后,系统重启,再次进入系统后,一切数据都被清空,怎样可以得知之前到底是否恢复出厂设置了呢?怎样可以标记 恢复出厂设置事件 ?我希望在系统重启后,根据客户需求,判断出刚刚恢复过出厂设置, ...

  9. Android知识点 431 -- recovery 强制执行恢复出厂设置(Rescue Party)

    转载原文:https://www.cnblogs.com/codeking100/p/10339258.html 返回知识列表:Android知识点list 1 Incremented rescue ...

  10. android 设备管理器 解锁,4种方法解锁Android手机模式锁定而无需恢复出厂设置

    第1部分:如何使用dr.fone解锁Android模式锁定而无需恢复出厂设置? 如果您正在寻找一种快速可靠的方式来移动任何Android设备上的锁定屏幕,那么只需尝试dr.fone - Android ...

最新文章

  1. RunTime的使用-Category改变整个项目全部字体
  2. 传感器是大数据的重要来源
  3. Mysql 向表中插入50万条数据(生成随机字符串和 插入的时间间隔是60s)。
  4. MySQL配置文件my.cnf中文详解
  5. 初学者先学python语音好吗_献给Python初学者 零基础学习Python能学会吗
  6. 阿里云服务器如何安装memcached
  7. 软件测试——进程调度(短作业优先调度算法+先来先服务算法)测试
  8. 《Ext详解与实践》节选:文件上传
  9. java if,if...else...的应用
  10. 草根教程 网友详解索尼本本装雪豹过程
  11. Windows Maven环境变量配置
  12. .nett Core之路由配置
  13. Uncaught TypeError: undefined is not a function
  14. 安卓音效AudioEffect源码剖析2——音效库接口
  15. 领域驱动架构(DDD)建模中的模型到底是什么?
  16. 福禄克FLUKE OFP2-100-Q CH主要技术规格
  17. 每日英语-20171115
  18. Java基础:如何在IDEA中查看依赖关系
  19. 已解决:connection holder is null问题。
  20. 写点东西祭奠老师这个职业

热门文章

  1. 朱松纯 | 人工智能的现状、任务、构架与统一(上)
  2. 图片使用内存法进行浮雕处理_无锡浮雕景观雕塑制作安装
  3. 如何快速开发一个网站
  4. 浅析Statement和PreparedStatement的区别
  5. 三国志14计算机中丢失,三国志14无法正常游戏的常见问题和解决办法
  6. java项目配置maven的setting文件访问阿里云仓库下载jar包
  7. 基于Matlab计算经典CFAR阈值
  8. Windows并发测试工具
  9. python灰产_python入门之编码风格规范分享
  10. 传统开发有必要学Dubbo吗