充电/低电量提醒上层监听UEventObserver()

充电提醒上层监听UEventObserver()

上层监听Kernel上报的UEvent事件Demo:
https://blog.csdn.net/potato_man/article/details/95492947
uevent事件原理:
http://e.betheme.net/article/show-66721.html?action=onClick
对usb的监听,可参考:
frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

我们参考谷歌的原生USB管理服务UsbDeviceManager.java,在PowerManagerService中添加一个充电弹窗功能:
注意是写在服务中,PowerManager只是单纯的一个类,不是服务,所以我们不能写在PowerManager.java中。即是usb的uevent事件是写在UsbDeviceManager.java服务中,而不是写在UsbManager.java中,写在PowerManager.java中会造成刷机后launcher界面是黑屏的。。

一、导包

```java
import android.os.UEventObserver;  //add
import android.app.AlertDialog;
import android.os.Looper;
import android.view.WindowManager;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.util.Slog;
import android.os.Message;
```

二、定义需要使用的变量

```java
public final class PowerManagerService extends SystemService
        implements Watchdog.Monitor {
    //add begin 
    private final UEventObserver mUEventObserver;
    //定义可以运行在主线程的handler,为了能弹窗
    private static final int MSG_SHOW_DIALOG = 20;
    private AlertDialog mWarningDialog = null;
    //add end
    private static final String TAG = "PowerManagerService";
```

 三、在PowerManagerService的构建方法中注册监听驱动结点

```java
  @VisibleForTesting
    PowerManagerService(Context context, Injector injector) {
        super(context);
        //add begin
        mUEventObserver = new JXUsbUEventObserver();
        mUEventObserver.startObserving("DEVPATH=/devices/virtual/android_usb/android0");
```

四、监听驱动结点uevent事件的处理类

```java
  //add uevent事件监听
    private final class JXUsbUEventObserver extends UEventObserver {
        @Override
        public void onUEvent(UEventObserver.UEvent event) {
            Slog.v(TAG, "USB UEVENT: " + event.toString());
            showDialog();
        }
    }

  private void showDialog(){
        //add
        Message mJxmsg = new Message();
        mJxmsg.what = MSG_SHOW_DIALOG;
        mHandler.sendMessage(mJxmsg);
    }

```
这个mHandler已经是运行在PMS主线程的了,PMS代码中就已经存在的了,拥有修改UI的权限,我们直接调用它来发送信息,不需要自己去构建一个Handler(Looper.getMaininLooper())

五、处理这个消息

找到mHanlder对应的handleMessage方法

```java
private final class PowerManagerHandlerCallback implements Handler.Callback {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
               ...
                case MSG_WAKELOCK_TIMEOUT:
                    int flags = msg.arg1;
                    IBinder lock = (IBinder)msg.obj;
                    Slog.d(TAG, " handle MSG_WAKELOCK_TIMEOUT: lock=" + Objects.hashCode(lock)
                            + ", flags=0x" + Integer.toHexString(flags));
                    releaseWakeLockInternal(lock, flags);
                    break;
                    //add begin
                case MSG_SHOW_DIALOG:
                    if (mWarningDialog == null) {
                        AlertDialog.Builder builder = new AlertDialog.Builder(mContext)
                                .setMessage("jx的手机正在进行充电!")
                                .setTitle("usb已经连接,还有5秒手机将会爆炸")
                                .setPositiveButton(com.android.internal.R.string.usb_ok,
                                        new OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog,
                                                                int witch) {
                                                // TODO Auto-generated method stub
                                                dialog.dismiss();
                                            }
                                        });
                        mWarningDialog = builder.create();
                        mWarningDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                        mWarningDialog.setCanceledOnTouchOutside(false);
                    }
                    if (!mWarningDialog.isShowing()) {
                        mWarningDialog.show();
                    }
                    break;
                    //add end
            }
            return true;
        }
    }
```
注意:这个驱动结点是监听usb插拔的,也就是说插上和拔出都会有弹窗。

后续如果想做低电量提醒功能,只要驱动同事提供了相应可以监听的驱动结点,进行修改即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值