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 方法
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/