android 开机向导OOBE源码分析
来源:互联网 发布:自然语言识别java 编辑:程序博客网 时间:2024/04/20 04:46
OOBE是开机向导,普通的理解就是一个界面跳另一个界面再跳下一个界面,OOBE却不是这么实现的。下面分析OOBE界面跳转实现:
打开OOBE目录,找到入口是WizardActivity.java,该Activity随后跳转到MainActivity.java。OOBE界面跳转逻辑都在MainActivity.java里实现。
对于一个陌生的Activity,我们先看它的onCreate方法:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("xsslog","OOBE MainActivity onCreate() ----------111"); this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);//forbid homeKey mSimExist = isSimExist(); Xlog.d(TAG, "onCreate mSimExist = " + mSimExist); if (savedInstanceState != null) { mCurrentStep = savedInstanceState.getInt("currentStep"); mTotalStep = savedInstanceState.getInt("totalSteps"); Log.i("xsslog", "restore saved instance state mCurrentStep=" + mCurrentStep + "mTotalStep=" + mTotalStep); setActivityList(); } //Diable window rotate for phone. setWindowRotation(false); //disable quick start guide for tablet //disableQSG(); mIsFirstRun = Settings.System.getInt(getContentResolver(), Utils.OOBE_HAS_RUN_KEY, 0) == 0; Log.i("xsslog","OOBE MainActivity onCreate() -----222-----mIsFirstRun="+mIsFirstRun); if (mIsFirstRun) { Settings.System.putInt(getContentResolver(), Settings.System.OOBE_DISPLAY, Settings.System.OOBE_DISPLAY_ON); Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0); enableStatusBar(false); } mBootMode = getBootMode(); if (mIsFirstRun && mBootMode != BOOT_MODE_ADV_META && !Utils.isWifiOnly(this)) { mHandler.sendEmptyMessageDelayed(EVENT_MONITOR_SIM_TIME_OUT, TIME_MONITOR_SIM); Log.i("xsslog","OOBE MainActivity ()========="); //showDialog(DIALOG_WAITING_SIM); } else { mHandler.sendEmptyMessage(EVENT_SIM_DETECTING_READY); } mSIMIntentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_INFO_UPDATE); registerReceiver(mSIMStateReceiver, mSIMIntentFilter); pm = getPackageManager(); name = new ComponentName(this, WizardActivity.class);if(pm != null)//added by lzp state = pm.getComponentEnabledSetting(name);/* mVelocityTracker = VelocityTracker.obtain(); mScreenOffReceiverFilter = new IntentFilter(); mScreenOffReceiverFilter.addAction(Intent.ACTION_SCREEN_ON); registerReceiver(mScreenOffReceiver,mScreenOffReceiverFilter); */ }其中mCurrentStep是指当前界面数,mTotalStep是指OOBE总界面数。mIsFirstRun判断是否第一次进入OOBE,做相应处理
这里的重点是看setActivityList();
protected void setActivityList() { boolean mIphoneFlag = Settings.System.getInt(this.getContentResolver(), Settings.System.ISIPHONE, 0) == 1;//added by lzp boolean noIphoneChars = "1".equals(SystemProperties.get("ro.cenon_setting_no_iPhone"));//added by lzp boolean switchPagesByLogo = "1".equals(SystemProperties.get("cenon.switch_oobe_pages_by_logo"));//added by lzp Xlog.d(TAG, "setActivityList() mIphoneFlag="+mIphoneFlag); mStepActivityies.clear(); if((!switchPagesByLogo && !noIphoneChars) || mIphoneFlag) { mStepActivityies.add(mLanguageSettings); mStepActivityies.add(mCountrySettings); mStepActivityies.add(iMessageAndFaceTime);// add by csc for ios 10 mStepActivityies.add(mInputMethodSettings); mStepActivityies.add(mWifiSettings); mStepActivityies.add(mfinishOobe); } else {//added by lzp mStepActivityies.add(mLanguageSettings); mStepActivityies.add(mCountrySettings); mStepActivityies.add(mInputMethodSettings); mStepActivityies.add(mfinishOobe); } mTotalStep = mStepActivityies.size(); }
可以看到每个界面都被加到了mStepActivityies里面,mTotalStep就是在这里得出
private List<OobeActivityInfo> mStepActivityies = new ArrayList<OobeActivityInfo>();我们发现里面有个mHandler处理,于是我们跳到该mHandler:
private Handler mHandler = new Handler() { @Override public void handleMessage(android.os.Message msg) { switch (msg.what) { case EVENT_MONITOR_SIM_TIME_OUT: Xlog.v(TAG, "handler wait SIM time out"); break; case EVENT_SIM_DETECTING_READY: Xlog.v(TAG, "handler SIM initialization finish"); mHandler.removeMessages(EVENT_MONITOR_SIM_TIME_OUT); break; case EVENT_PREPAREING_END_OOBE: mHandler.removeMessages(EVENT_PREPAREING_END_OOBE); finish(); break; default: break; } initStep(); //removeDialog(DIALOG_WAITING_SIM); }; };可以看到有EVENT_MONITOR_SIM_TIME_OUT,EVENT_SIM_DETECTING_READY,EVENT_PREPAREING_END_OOBE等情况的处理,我们主要研究OOBE界面是如何进行跳转的,上面的就不细做分析了。然后就注意到initStep()方法
private void initStep() { if (mIsStepInitiated) { return; } mIsStepInitiated = true; setActivityList(); if (mCurrentStep == -1) { nextActivity(true); } }setActivityList()上面说了把界面都放入list,重点看nextActivity方法
protected void nextActivity(boolean nextStep) { if (nextStep) {if(mCurrentStep<0) { mCurrentStep++; Intent lockScreenIntent = new Intent(ACTION_LOCK_SCREEN); startActivityForResult(lockScreenIntent, REQUEST_CODE_ADVANCED_SETTINGS); return; } else mCurrentStep++; } else { mCurrentStep--; } if (mCurrentStep >= 0 && mCurrentStep < mStepActivityies.size()) { Intent intent = mStepActivityies.get(mCurrentStep).getIntent(); intent.putExtra(Utils.OOBE_BASIC_STEP_TOTAL, mTotalStep); intent.putExtra(Utils.OOBE_BASIC_STEP_INDEX, mCurrentStep + 1); intent.putExtra(EXTRA_IS_OOBE, true); startActivityForResult(intent, mCurrentStep); if (nextStep) { overridePendingTransition(R.anim.slide_right_in, R.anim.slide_left_out); //overridePendingTransition(R.anim.zoomin, R.anim.zoomout); } else { overridePendingTransition(R.anim.slide_left_in, R.anim.slide_right_out); //overridePendingTransition(R.anim.zoomin, R.anim.zoomout); } } }nextStep用来判断下一步还是上一步,mCurrentStep是要跳转界面的值,知道这个前一部分代码就好理解了
Intent intent = mStepActivityies.get(mCurrentStep).getIntent(); intent.putExtra(Utils.OOBE_BASIC_STEP_TOTAL, mTotalStep); intent.putExtra(Utils.OOBE_BASIC_STEP_INDEX, mCurrentStep + 1); intent.putExtra(EXTRA_IS_OOBE, true); startActivityForResult(intent, mCurrentStep);根据mCurrentStep从mStepActivityies取出该界面的包名,用startActivityForResult方法进行跳转,我们可以看下回传的参数用来干嘛
其他界面点击上一步或者下一步的时候就调用finishActivityByResult(Utils.RESULT_CODE_TO_NO_STEP);
@Override public void onClick(View view) { switch (view.getId()) { case R.id.back_settings_btn: finishActivityByResult(Utils.RESULT_CODE_TO_NO_STEP); break; case R.id.next_settings_btn: /* Intent intent = new Intent(); intent.setClass(OobeLoginiCloudActivity.this,OobeTermsAndConditionsActivity.class); intent.putExtra("GOTO_BY_ICLOUD",true); startActivity(intent); finish();*/ finishActivityByResult(Utils.RESULT_CODE_TO_TWO_STEP); break; } }
private void finishActivityByResult(int resultCode) { Intent intent = new Intent(); setResult(resultCode, intent); finish(); }然后把这个是跳上一步还是下一步传回MainActivity,由MainActivity进行统一跳转,而不是从当前界面直接往下跳。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { Xlog.d(TAG, "onActivityResult resultCode = " + resultCode); switch (resultCode) { case Utils.RESULT_CODE_BACK: if (0 == mCurrentStep) { finish(); } else { nextActivity(false); } break; case Utils.RESULT_CODE_NEXT: nextActivity(true); break; case Utils.RESULT_CODE_FINISH: finishOOBE(); break; case Utils.RESULT_CODE_TO_ONE_STEP:// add by csc for ios 10 mCurrentStep++; nextActivity(true); break; case Utils.RESULT_CODE_TO_TWO_STEP:// add by csc for ios 10 mCurrentStep=mCurrentStep+2; nextActivity(true); break; case Utils.RESULT_CODE_TO_LOGIN_ICLOUD:// add by csc for ios 10 intent = new Intent(); intent.setClass(MainActivity.this,OobeLoginiCloudActivity.class); startActivityForResult(intent, 1001); break; case Utils.RESULT_CODE_TO_FORGET_PASSWORD: intent = new Intent(); intent.setClass(MainActivity.this,OobeForgetPasswordActivity.class); startActivityForResult(intent, 1001); break; case Utils.RESULT_CODE_TO_CREATE_APPLE_ID:// add by csc for ios 10 intent = new Intent(); intent.setClass(MainActivity.this,OobeCreateAppleIdActivity.class); startActivityForResult(intent, 1001); break; case Utils.RESULT_CODE_TO_FORGET_APPLE_ID:// add by csc for ios 10 intent = new Intent(); intent.setClass(MainActivity.this,OobeForgetAppleIDActivity.class); startActivityForResult(intent, 1001); break; case Utils.RESULT_CODE_TO_NO_STEP:// add by csc for ios 10 mCurrentStep--; nextActivity(true); break; case 100: { /**Begin: added by lzp **/if(mCurrentStep < 0) {mHandler.sendEmptyMessage(EVENT_SIM_DETECTING_READY);return; } /**End: added by lzp **/ Intent backIntent = mStepActivityies.get(mCurrentStep).getIntent(); backIntent.putExtra(Utils.OOBE_BASIC_STEP_TOTAL, mTotalStep); backIntent.putExtra(Utils.OOBE_BASIC_STEP_INDEX, mCurrentStep + 1); backIntent.putExtra(EXTRA_IS_OOBE, true); startActivityForResult(backIntent, mCurrentStep); overridePendingTransition(R.anim.slide_left_in, R.anim.slide_right_out); //overridePendingTransition(R.anim.zoomin, R.anim.zoomout); } break; case Utils.RESULT_SCREEN_OFF: {Intent lockScreenIntent = new Intent(ACTION_LOCK_SCREEN); startActivityForResult(lockScreenIntent, REQUEST_CODE_ADVANCED_SETTINGS); overridePendingTransition(R.anim.slide_left_in, R.anim.slide_right_out); //overridePendingTransition(R.anim.zoomin, R.anim.zoomout);} break; default: break; } }
到这里就完成了OOBE的界面跳转。
阅读全文
0 0
- android 开机向导OOBE源码分析
- OOBE分析
- android 开机向导
- android开机向导实现
- Android M 概率跳不过google开机向导原因分析
- Android 开机动画源码分析
- oobe crash 分析
- android开机向导的实现
- android开机向导的实现
- android OOBE创建方法
- android OOBE创建方法
- Android Provision (OOBE)
- android OOBE创建方法
- Android 开机动画源码分析1
- Android源码分析---系统开机流程
- Android开机向导setupwizard,设置系统语言,WiFi向导
- Android Provision(开机向导setupwizard程序)
- android MTK 禁止第一次开机向导
- chrome 调试工具的使用
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- $ each() 小结
- js 中 的 if使用条件
- js 闭包 理解 copy
- android 开机向导OOBE源码分析
- 为Notepad++配置VS2010的C++编译器
- less 官网讲解 ( http://www.bootcss.com/p/lesscss/ )
- 总结:Struts2中jsp页面向后端action的4种传参方式
- gulp ( http://markpop.github.io/2014/09/17/Gulp入门教程 )
- cesium 中地图发生了平移,放缩,旋转等动作所要执行的动作
- maven 单元测试 ( http://www.cnblogs.com/qinpengming/p/5225380.html )
- hive表权限管理
- this 关键字 详解