充电提醒上层监听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插拔的,也就是说插上和拔出都会有弹窗。
后续如果想做低电量提醒功能,只要驱动同事提供了相应可以监听的驱动结点,进行修改即可。