在Android系统中,长按Power键默认会弹出对话框,可以你选择“静音”,“关机”,“重启”等功能。
弹出对话框的代码位于:
frameworks/ policies/ base/ phone/ com/ android/ internal / policy / impl/ PhoneWindowManager. java
显示对话框的代码如下:
Runnable mPowerLongPress = new Runnable ( ) {
public void run ( ) {
mShouldTurnOffOnKeyUp = false;
performHapticFeedbackLw( null , HapticFeedbackConstants. LONG_PRESS, false) ;
sendCloseSystemWindows( SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS) ;
showGlobalActionsDialog( ) ;
}
} ;
调用showGlobalActionsDialog方法将会显示上面提到的显示“静音”,“关机”,“重启”等选项的对话框。
继续跟踪showGlobalActionsDialog方法,代码如下:
void showGlobalActionsDialog( ) {
if ( mGlobalActions = = null ) {
mGlobalActions = new GlobalActions( mContext) ;
}
final boolean keyguardShowing = mKeyguardMediator. isShowingAndNotHidden( ) ;
mGlobalActions. showDialog ( keyguardShowing, isDeviceProvisioned( ) ) ;
if ( keyguardShowing) {
// since it took two seconds of long press to bring this up,
// poke the wake lock so they have some time to see the dialog.
mKeyguardMediator. pokeWakelock( ) ;
}
}
GlobalActions相关的 代码位于:
frameworks/ policies/ base/ phone/ com/ android/ internal / policy / impl/ GlobalActions. java
其中,showDialog的代码如下:
public void showDialog ( boolean keyguardShowing, boolean isDeviceProvisioned) {
mKeyguardShowing = keyguardShowing;
mDeviceProvisioned = isDeviceProvisioned;
if ( mDialog = = null ) {
mStatusBar = ( StatusBarManager) mContext. getSystemService( Context . STATUS_BAR_SERVICE) ;
mDialog = createDialog ( ) ;
}
prepareDialog( ) ;
mStatusBar. disable ( StatusBarManager. DISABLE_EXPAND) ;
mDialog. show ( ) ;
}
showDialog中会调用createDialog方法,以创建相应的对话框。createDialog方法中,有如下代码:
mItems = Lists. newArrayList(
// silent mode
mSilentModeToggle,
// next: airplane mode
//mAirplaneModeOn,
// next: reboot
new SinglePressAction( com. android. internal . R. drawable. ic_lock_power_off, R. string . global_action_reboot) {
public void onPress( ) {
ShutdownThread. reboot( mContext, true) ;
}
public boolean showDuringKeyguard( ) {
return true;
}
public boolean showBeforeProvisioning( ) {
return true;
}
} ,
// last: power off
new SinglePressAction(
com. android. internal . R. drawable. ic_lock_power_off,
R. string . global_action_power_off) {
public void onPress( ) {
// shutdown by making sure radio and power are handled accordingly.
ShutdownThread. shutdown ( mContext, true) ;
}
public boolean showDuringKeyguard( ) {
return true;
}
public boolean showBeforeProvisioning( ) {
return true;
}
} ) ;
从代码中我们可以看出,如果选择上述对话框的“关机”选项之后,将会调用ShutdownThread的shutdown方法来关机,shutdown方法的第二个参数表示是否弹出询问对话框。 如果选择上述对话框的“重启”选项之后,将会调用ShutdownThread的reboot方法来重启,reboot方法的第二个参数表示是否弹出询问对话框。
createDialog方法中还有如下代码:
mAdapter = new MyAdapter( ) ;
final AlertDialog. Builder ab = new AlertDialog. Builder( mContext) ;
ab. setAdapter( mAdapter, this )
. setInverseBackgroundForced( true)
. setTitle ( R. string . global_actions) ;
final AlertDialog dialog = ab. create ( ) ;
dialog . getWindow ( ) . setType ( WindowManager. LayoutParams. TYPE_SYSTEM_DIALOG) ;
if (!mContext.getResources().getBoolean(
com.android.internal.R.bool.config_sf_slowBlur)) {
dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
}
dialog . setOnDismissListener( this ) ;
其中,“dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND); ”语句的作用是添加相应的特效:即弹出对话框的时候,让对话框后面的背景模糊显示。如果不需要这样的特效,可以将相关语句注释掉即可。
其他特效:
1)FLAG_DIM_BEHIND :会让背景的亮度变暗。
再来看看ShutdownThread,其定义的源文件在:
frameworks/ base/ core/ java / com/ android/ internal / app/ ShutdownThread. java
如果选择上述对话框的“关机”选项之后,将会调用ShutdownThread的shutdown方法来关机。 如果选择上述对话框的“重启”选项之后,将会调用ShutdownThread的reboot方法来重启。shutdown方法和reboot方法的定义如下:
public static void shutdown ( final Context context , boolean confirm) {
shutdown ( context , confirm, false) ;
}
public static void reboot( final Context context , boolean confirm) {
shutdown ( context , confirm, true) ;
}
它们都会调用到public static void shutdown(final Context context, boolean confirm, final boolean reboot)
文章转自:http://blog.chinaunix.net/uid-21515470-id-1825152.html