最近项目需求,RK3326平台,无触摸机器(智能电子称),可以接鼠标操作。需求是这样的,客户要保证自己的app一直在前台运行,当用户手动切到桌面或者其他app,超过一分钟没有操作就回到客户的app界面。刚开始想在PhoneWindowManager里面去监听按键事件,后来发现有点问题,于是用了另一个办法,在frameworks/base/core/java/android/view,在这里有个叫ViewRootImpl.java的类,里面有个广播
final class WindowInputEventReceiver extends InputEventReceiver { public WindowInputEventReceiver(InputChannel inputChannel, Looper looper) { super(inputChannel, looper); } @Override public void onInputEvent(InputEvent event, int displayId) { enqueueInputEvent(event, this, 0, true); if(event instanceof MotionEvent){ MotionEvent motionEvent = (MotionEvent)event; if(motionEvent.getAction()==MotionEvent.ACTION_UP){ Intent intent =new Intent("com.rp.ACTION_UP"); mContext.sendBroadcast(intent); Log.i("gyx","MotionEvent.ACTION_UP"); } } } @Override public void onBatchedInputEventPending() { if (mUnbufferedInputDispatch) { super.onBatchedInputEventPending(); } else { scheduleConsumeBatchedInput(); } } @Override public void dispose() { unscheduleConsumeBatchedInput(); super.dispose(); } }WindowInputEventReceiver,这个广播会接受到系统的各种事件,按键,触摸等,一旦有触摸或者按键事件,onInputEvent方法就会响应,这要在这里面检测,通过计算就可以知道用户多长事件无操作。我在这里当用户按键事件抬起的时候发送广播
//add by gyx static final class CheckRunnable implements Runnable { @Override public void run() { if (!isForeground()) { Intent startIntent = new Intent(); ComponentName componentName = new ComponentName("com.sayesInternet.yunkangbao", "activity为com.sayesinternet.yunkangbao.ui.WelcomeActivity"); startIntent.setComponent(componentName); mContext.startActivity(startIntent); } } } private static boolean isForeground() { ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); ComponentName cn = am.getRunningTasks(1).get(0).topActivity; String currentPackageName = cn.getPackageName(); if (!TextUtils.isEmpty(currentPackageName) && currentPackageName.equals("com.qingniu.sharescale")) { Log.i("gyx", "isForeground"); return true; } Log.i("gyx", "not Foreground"); return false; } final static CheckRunnable mCheckRunnable = new CheckRunnable(); //end接收端处理事件
if (action.equals("com.rp.ACTION_UP")) { mHandler.removeCallbacks(mCheckRunnable); mHandler.postDelayed(mCheckRunnable, 60 * 1000); }这样就大功告成了