修改Android关机界面

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值