Android version 2.3.5
首先查看Settings里控制开关
02 |
boolean ipoSettingEnabled
= Settings.System.getInt(getContentResolver(), |
03 |
Settings.System.IPO_SETTING,1)
== 1; |
04 |
if(mIpoSetting!=null){ |
05 |
mIpoSetting.setChecked(ipoSettingEnabled); |
08 |
boolean isChecked
= ((CheckBoxPreference) preference).isChecked(); |
09 |
Settings.System.putInt(getContentResolver(),
Settings.System.IPO_SETTING, |
全局搜索 Settings.System.IPO_SETTING ,发现在关机系统里调用了该状态(ShutdownThread.java)
ShutdownThread 里的 checkShutdownFlow 方法
02 |
if (FeatureOption.MTK_IPO_SUPPORT
== false ||
mReboot == true)
{ |
03 |
mShutdownFlow
= NORMAL_SHUTDOWN_FLOW; //
更改状态 |
09 |
isIPOEnabled
= Settings.System.getInt(sInstance.mContext.getContentResolver(), |
10 |
Settings.System.IPO_SETTING, 1)
== 1; |
11 |
} catch (NullPointerException
ex) { |
12 |
mShutdownFlow
= NORMAL_SHUTDOWN_FLOW; |
15 |
if (isIPOEnabled
== true)
{ |
17 |
if ("1".equals(SystemProperties.get("sys.ipo.battlow"))) |
18 |
mShutdownFlow
= NORMAL_SHUTDOWN_FLOW; |
20 |
mShutdownFlow
= IPO_SHUTDOWN_FLOW; |
22 |
mShutdownFlow
= NORMAL_SHUTDOWN_FLOW; |
以上函数如果正常进入快速关机模式
mShutdownFlow = IPO_SHUTDOWN_FLOW
关机流程会调用 ShutdownThread.shutdown(mContext, true);
ShutdownThread 里的 shutdown 方法
01 |
bConfirmForAnimation
= 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)
{ |
11 |
beginShutdownSequence(context); |
12 |
if (mDialog
!= null)
{ |
17 |
.setNegativeButton(com.android.internal.R.string.no, new DialogInterface.OnClickListener()
{ |
18 |
public void onClick(DialogInterface
dialog, int which)
{ |
19 |
synchronized (sIsStartedGuard)
{ |
22 |
if (mDialog
!= null)
{ |
28 |
mDialog.setCancelable(false); |
29 |
mDialog.getWindow().setType( |
30 |
WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); |
31 |
mDialog.getWindow().addFlags( |
32 |
WindowManager.LayoutParams.FLAG_DIM_BEHIND); |
34 |
if (!mDialog.isShowing())
{ |
38 |
beginShutdownSequence(context); |
ShutdownThread 里的 beginShutdownSequence 方法
1 |
if (mShutdownFlow
== IPO_SHUTDOWN_FLOW) { |
3 |
synchronized (mShutdownThreadSync)
{ |
4 |
mShutdownThreadSync.notify(); |
ShutdownThread 里的 run 方法
03 |
while (mShutdownFlow
== IPO_SHUTDOWN_FLOW) { |
04 |
stMgr.saveStates(mContext); |
07 |
if (mShutdownFlow
!= IPO_SHUTDOWN_FLOW) { |
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 方法
ShutdownThread 里的 running 方法
1 |
//广播全局事件
android.intent.action.ACTION_SHUTDOWN_IPO |
5 |
stMgr.shutdown(mContext); |
ShutdownManager 里的 shutdown 方法
1 |
mPowerManager
= (PowerManager)context.getSystemService("power"); |
2 |
mPowerManager.goToSleep(SystemClock.uptimeMillis()); |
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); |
03 |
win.setFlags(1024, 1024); |
04 |
win.setLayout(-1,
-1); |
05 |
win.requestFeature(1); |
06 |
android.view.WindowManager.LayoutParams
params = win.getAttributes(); |
07 |
params.setTitle("IPOWindow"); |
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"); |
底层实现
mediatek/source/external/ipod/
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型
关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...
- 手游录屏直播技术详解 | 直播 SDK 性能优化实践
在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...
- CDN学习笔记二(技术详解)
一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
- CDN技术详解及实现原理
CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...
- 如何将HLS延时缩短至4秒,HLS+技术详解
在直播应用中,RTMP 和 HLS 是两种较为成熟且广泛应用的流媒体协议,基本上可以覆盖所有客户端.RTMP 是互联网 TCP/IP 五层体系结构中应用层的协议,主要优势就是实时性高,基本可将直播延时 ...
- 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践
本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...
- IPv6技术详解:基本概念、应用现状、技术实践(下篇)
本文来自微信技术架构部的原创技术分享. 1.前言 在上篇<IPv6技术详解:基本概念.应用现状.技术实践(上篇)>,我们讲解了IPV6的基本概念. 本篇将继续从以下方面展开对IPV6的讲解 ...
随机推荐
- 第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析
新建一个Java Project :LuceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar (核心包) 2) lucene- ...
- Gazebo機器人仿真學習探索筆記(二)基本使用說明
在完成Gazebo7安裝後,需要熟悉Gazebo,方便之後使用. 部分源代碼可以參考:https://bitbucket.org/osrf/gazebo/src/ 如果還沒有安裝請參考之前內容完成安裝 ...
- Java的多态及注意事项
什么是多态: 多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序.在Java中,所有的方法都是通过动态绑定实现多态的.将一个方法调用同一个方法主体关联起来被称作绑定.动态绑定的含义是在运行 ...
- 嵌入式LINUX环境下视频采集知识
V4L2是Linux环境下开发视频采集设备驱动程序的一套规范(API),它为驱动程序的编写提供统一的接口,并将所有的视频采集设备的驱动程序都纳入其的管理之中.V4L2不仅给驱动程序编写者带来极大的方便 ...
- Cocos2D结合CoreGraphics实现RPG人物中空黑洞吸入效果
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 之前的博文中我们实现了RPG人物的复古效果. 现在我们再完点h ...
- Linux系统编程----僵尸进程
什么是僵尸进程? 僵尸进程, 指子进程退出后, 父进程还没有回收子进程的资源,这个子进程就处在于僵尸状态. 来看看如何产生? #include <stdio.h> #include < ...
- [openwrt] uci 的shell和lua接口
uci是openwrt上配置操作的接口,不管是自动化的shell脚本,还是使用luci来二次开发配置界面,都会用到这部分知识. uci提供了lua, shell, c接口,这里主要用到了前两种 she ...
- 免安装版本tomcat 指定的服务并未以已安装的服务存在,Unable to open the service
今天在自己的电脑上安装了Tomcat6.0.14,是在Tomcat主页上直接下载的免安装版.但是把文件解压的之后,双击Tomcat6w.exe时,去出现了"指定的服务并未以已安装的服务存在, ...
- Android程序崩溃异常收集框架
最近在写Android程序崩溃异常处理,完成之后,稍加封装与大家分享. 我的思路是这样的,在程序崩溃之后,将异常信息保存到一个日志文件中,然后对该文件进行处理,比如发送到邮箱,或发送到服务器. 所以, ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面看一下CatSprite中最复杂的moveToward方法, ...