Android version 2.3.5

首先查看Settings里控制开关

01 //
获取当前状态
02 boolean ipoSettingEnabled
= Settings.System.getInt(getContentResolver(),
03             Settings.System.IPO_SETTING,1)
== 
1;
04 if(mIpoSetting!=null){
05     mIpoSetting.setChecked(ipoSettingEnabled);
06 }
07 //设置新状态
08 boolean isChecked
= ((CheckBoxPreference) preference).isChecked();
09 Settings.System.putInt(getContentResolver(),
Settings.System.IPO_SETTING,
10                 isChecked
1:0);

全局搜索 Settings.System.IPO_SETTING ,发现在关机系统里调用了该状态(ShutdownThread.java)

ShutdownThread 里的 checkShutdownFlow 方法

01 //
判断是否不支持该功能 是否需要重启
02 if (FeatureOption.MTK_IPO_SUPPORT
== 
false ||
mReboot == 
true)
{
03     mShutdownFlow
= NORMAL_SHUTDOWN_FLOW;    
//
更改状态     
04     return;
05 }
06 boolean isIPOEnabled;
07 try {
08     //
获取当前状态
09     isIPOEnabled
= Settings.System.getInt(sInstance.mContext.getContentResolver(),
10         Settings.System.IPO_SETTING, 1)
== 
1;
11 catch (NullPointerException
ex) {
12     mShutdownFlow
= NORMAL_SHUTDOWN_FLOW;
13     return;
14 }
15 if (isIPOEnabled
== 
true)
{
16     //
判断系统参数
17     if ("1".equals(SystemProperties.get("sys.ipo.battlow")))
18         mShutdownFlow
= NORMAL_SHUTDOWN_FLOW;
19     else
20         mShutdownFlow
= IPO_SHUTDOWN_FLOW;
21 else {
22         mShutdownFlow
= NORMAL_SHUTDOWN_FLOW;
23 }
24 return;

以上函数如果正常进入快速关机模式 

mShutdownFlow = IPO_SHUTDOWN_FLOW

关机流程会调用 ShutdownThread.shutdown(mContext, true);

ShutdownThread 里的 shutdown 方法

01 bConfirmForAnimation
= confirm;
02 if (confirm)
{
03     if (mDialog
== 
null)
{
04         mDialog
new AlertDialog.Builder(context)
05         .setIcon(android.R.drawable.ic_dialog_alert)
06         .setTitle(com.android.internal.R.string.power_off)
07         .setMessage(com.android.internal.R.string.shutdown_confirm)
08         .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener()
{
09             public void onClick(DialogInterface
dialog, 
int which)
{
10                 //确认关机
检查状态
11                 beginShutdownSequence(context);
12                 if (mDialog
!= 
null)
{
13                     mDialog
null;
14                 }
15             }
16         })
17         .setNegativeButton(com.android.internal.R.string.no, new DialogInterface.OnClickListener()
{
18             public void onClick(DialogInterface
dialog, 
int which)
{
19                 synchronized (sIsStartedGuard)
{
20                     sIsStarted
false;
21                 }
22                 if (mDialog
!= 
null)
{
23                     mDialog
null;
24                 }
25             }
26         })
27         .create();
28         mDialog.setCancelable(false);
29         mDialog.getWindow().setType(
30              WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
31         mDialog.getWindow().addFlags(
32              WindowManager.LayoutParams.FLAG_DIM_BEHIND);
33     }
34     if (!mDialog.isShowing())
{
35         mDialog.show();
36     }
37 else {
38     beginShutdownSequence(context);
39 }

ShutdownThread 里的 beginShutdownSequence 方法

1 if (mShutdownFlow
== IPO_SHUTDOWN_FLOW) {
2      checkShutdownFlow();
3      synchronized (mShutdownThreadSync)
{
4          mShutdownThreadSync.notify();
5      }
6  }

ShutdownThread 里的 run 方法

01 public void run()
{
02     checkShutdownFlow();
03     while (mShutdownFlow
== IPO_SHUTDOWN_FLOW) {
04         stMgr.saveStates(mContext);
05         running();
06     }
07     if (mShutdownFlow
!= IPO_SHUTDOWN_FLOW) {
08         running();
09     }
10 }

adb logcat -s “ShutdownThread”

01 ---------
beginning of /dev/log/system
02 ---------
beginning of /dev/log/main
03 D/ShutdownThread(  189):
!!! Request to shutdown !!!
04 D/ShutdownThread(  189):
Notifying thread to start radio shutdown
05 D/ShutdownThread(  189):
PowerOff dialog doesn't exist. Create it first
06 D/ShutdownThread(  189):
ShutdownThread exists already
07 D/ShutdownThread(  189):
checkShutdownFlow: IPO_Support=
true mReboot=false
08 D/ShutdownThread(  189):
checkShutdownFlow: isIPOEnabled=
true mShutdownFlow=1
09 D/ShutdownThread(  189):
shutdown acquire partial WakeLock 
2
10 I/ShutdownThread(  189):
Sending shutdown broadcast...
11 I/ShutdownThread(  189):
Waiting 
for Bluetooth
and Radio...
12 I/ShutdownThread(  189):
Radio and Bluetooth shutdown complete.
13 I/ShutdownThread(  189):
Shutting down MountService
14 W/ShutdownThread(  189):
Result code 
0 from
MountService.shutdown
15 I/ShutdownThread(  189):
Performing ipo low-level shutdown...

ShutdownManager 里的 saveStates 方法

1 //保存wifi状态

ShutdownThread 里的 running 方法

1 //广播全局事件
android.intent.action.ACTION_SHUTDOWN_IPO
2 //关闭蓝牙
3 //关闭Radio
4 //关闭MountService
5 stMgr.shutdown(mContext);

ShutdownManager 里的 shutdown 方法

1 mPowerManager
= (PowerManager)context.getSystemService(
"power");
2 mPowerManager.goToSleep(SystemClock.uptimeMillis());
3 ......
4 SystemProperties.set("ctl.start""ipod");
5 Intent
intent = 
new Intent("android.intent.action.black.mode");
6 intent.putExtra("_black_mode"true);
7 context.sendBroadcast(intent);

adb logcat -s “ShutdownManager”

01 ---------
beginning of /dev/log/system
02 ---------
beginning of /dev/log/main
03 I/ShutdownManager(  189):
btState: 
false
04 I/ShutdownManager(  189):
saveStates: wifi:
0,
airplaneModeState: 
0
05 V/ShutdownManager(  189):
Current Wallpaper = 
null
06 V/ShutdownManager(  189):
Current IME: com.android.inputmethod.pinyin
07 I/ShutdownManager(  189):
accessibility is disabled
08 I/ShutdownManager(  189):
killProcess (IME): com.android.inputmethod.pinyin
09 I/ShutdownManager(  189):
forceStopPackage: com.cooliris.media
10 V/ShutdownManager(  189):
process = com.android.settings
11 I/ShutdownManager(  189):
forceStopPackage: com.android.settings
12 I/ShutdownManager(  189):
forceStopPackage: com.mediatek.launcherplus
13 I/ShutdownManager(  189):
forceStopPackage: com.android.mms
14 I/ShutdownManager(  189):
forceStopPackage: android.process.media
15 I/ShutdownManager(  189):
forceStopPackage: android.process.media
16 I/ShutdownManager(  189):
forceStopPackage: android.process.media
17 I/ShutdownManager(  189):
forceStopPackage: com.mediatek.moreapp
18 I/ShutdownManager(  189):
forceStopPackage: com.mediatek.omacp
19 I/ShutdownManager(  189):
forceStopPackage: com.android.email
20 V/ShutdownManager(  189):
uid-process = com.mediatek.mdlogger
21 I/ShutdownManager(  189):
forceStopPackage: com.android.providers.calendar
22 I/ShutdownManager(  189):
forceStopPackage: com.android.deskclock
23 V/ShutdownManager(  189):
uid-process = com.android.ActivityNetwork
24 I/ShutdownManager(  189):
forceStopPackage: com.mediatek.weather

ActivityManagerPlus 接收到关机广播

adb logcat -s “ActivityManagerPlus”

1 ---------
beginning of /dev/log/system
2 ---------
beginning of /dev/log/main
3 I/ActivityManagerPlus(  189):
Receive:
4 Intent
{ act=android.intent.action.ACTION_SHUTDOWN_IPO }
5 I/ActivityManagerPlus(  189):
finished
6 I/ActivityManagerPlus(  189):
Receive:
7 Intent
{ act=android.intent.action.black.mode (has  extras) }
8 I/ActivityManagerPlus(  189):
createIPOWin

ActivityManagerPlus 里的 createIPOWin 方法 关机调用

01 Window
win = PolicyManager.makeNewWindow(context);
02 win.setType(2016);
03 win.setFlags(10241024);
04 win.setLayout(-1,
-
1);
05 win.requestFeature(1);
06 android.view.WindowManager.LayoutParams
params = win.getAttributes();
07 params.setTitle("IPOWindow");
08 params.flags
24;
09 WindowManagerImpl
wm = (WindowManagerImpl)context.getSystemService(
"window");
10 view
= win.getDecorView();
11 wm.addView(view,
params);

ActivityManagerPlus 里的 removeIPOWin 方法 开机调用

1 WindowManagerImpl
wm = (WindowManagerImpl)context.getSystemService(
"window");
2 wm.removeView(view);

底层实现 

mediatek/source/external/ipod/

MTK 快速开机 技术详解的更多相关文章

  1. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  2. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  3. 手游录屏直播技术详解 | 直播 SDK 性能优化实践

    在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...

  4. CDN学习笔记二(技术详解)

    一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...

  5. Python开发技术详解(视频+源码+文档)

    Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...

  6. CDN技术详解及实现原理

    CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...

  7. 如何将HLS延时缩短至4秒,HLS+技术详解

    在直播应用中,RTMP 和 HLS 是两种较为成熟且广泛应用的流媒体协议,基本上可以覆盖所有客户端.RTMP 是互联网 TCP/IP 五层体系结构中应用层的协议,主要优势就是实时性高,基本可将直播延时 ...

  8. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  9. IPv6技术详解:基本概念、应用现状、技术实践(下篇)

    本文来自微信技术架构部的原创技术分享. 1.前言 在上篇<IPv6技术详解:基本概念.应用现状.技术实践(上篇)>,我们讲解了IPV6的基本概念. 本篇将继续从以下方面展开对IPV6的讲解 ...

随机推荐

  1. Cocoa层粒子发射器动画添加多个cell的一种重构

    在iOS动画之旅第19章中最后的挑战中需要我们在雪花例子发生器中添加多个雪花贴图,也就是多个cell,因为我们不可能将每个cell的参数都重新写一遍,所以有必要写一个helper方法来做这件事: fu ...

  2. React Native组件只Image

    不管在Android还是在ios原生的开发中,图片都是作为控件给出来的,在RN中也有这么一个控件(Image).根据官网的资料,图片分为本地静态图片,网络图片和混合app资源.一下分类介绍来源官网. ...

  3. [struts2学习笔记] 第二节 使用Maven搞定管理和构造Struts 2 Web应用程序的七个步骤

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40303897 官方文档:http://struts.apache.org/releas ...

  4. Ext JS 6开发实例(二) :使用CMD创建应用程序

    由于Ext JS 6将原来的Ext JS和Sencha Touch合并为一个框架,因而在使用CMD来创建应用程序前,需要考虑清楚你是要创建一个通用应用程序,还是仅仅只是针对桌面或移动设备的应用程序. ...

  5. 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...

  6. 如何在Cocos2D游戏中实现A*寻路算法(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  7. JAVA之旅(二十三)——System,RunTime,Date,Calendar,Math的数学运算

    JAVA之旅(二十三)--System,RunTime,Date,Calendar,Math的数学运算 map实在是太难写了,整理得我都晕都转向了,以后看来需要开一个专题来讲这个了,现在我们来时来学习 ...

  8. Android开发模式之MVC,MVP和MVVM的简单介绍与区别

    相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候 ...

  9. iOS中 断点下载详解 韩俊强的博客

    布局如下: 基本拖拉属性: #import "ViewController.h" #import "AFNetworking.h" @interface Vie ...

  10. go: 一个通用log模块的实现

    在go里面,虽然有log模块,但是该模块提供的功能并不强,譬如就没有我们常用的level log功能,但是自己实现一个log模块也并不困难. 对于log的level,我们定义如下: const ( L ...