长按电源按钮发送BroadCast

时间:2013-08-09 09:38:12

标签: android broadcastreceiver

即使设备处于锁定状态,我也希望通过长按电源按钮将BroadcastReceiver发送到我的应用程序。直到现在我尝试各种动作,例如

      <action android:name="android.intent.action.SCREEN_OFF" >
            </action>
            <action android:name="android.intent.action.SCREEN_ON" >
            </action>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" >
            </action>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" >
            </action>
            <action android:name="android.intent.action.ACTION_SHUTDOWN" >
            </action>

在我的但是没有给出好的效果。我的BroadcastReciever仅适用于用户关闭设备的情况。 请帮我解决这个问题。 感谢

1 个答案:

答案 0 :(得分:2)

添加意图过滤器:

IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

BroadcastReceiver myReceiver = new MYBCR();
registerReceiver(myReceiver, filter);  

您的广播接收者:

 @Override
public void onReceive(Context context, Intent intent) {

    if(intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){
        Log.d("tag", "system dialog close");
    }
}

这对我来说很好,它也可以监听每个系统对话框。 如果您只想长按电源按钮,可以使用服务,并且在浏览开发人员指南后没有找到任何广播接收器。

以下是我对服务的处理方式:

@Override
public void onCreate() {
    super.onCreate();

mLinear = new LinearLayout(getApplicationContext()) {

        //home or recent button
        public void onCloseSystemDialogs(String reason) {
            if ("globalactions".equals(reason)) {
                Log.d("tag", "Long press on power button");
            } else if ("homekey".equals(reason)) {
                //home key pressed
            } else if ("recentapps".equals(reason)) {
                // recent apps button clicked
            }
        }

    };



    mLinear.setFocusable(true);

    View mView = LayoutInflater.from(this).inflate(R.layout.test, mLinear);
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

    //params

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            1,
            1,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            PixelFormat.OPAQUE);
    params.gravity = Gravity.TOP | Gravity.LEFT;
    wm.addView(mView, params);
}

你需要一个布局,并确保它是一个线性布局,就是这样。 即使屏幕被锁定,您也可以长按电源。

希望这会有所帮助。