安卓后台监听按键事件
阅读原文时间:2021年04月20日阅读:1

我们都知道要做监听的话首先需要去重写Activity的OnkeyDown方法,然而这种办法只有当Activity在前台的时候才能用!在后台的话就不行了。

可以用的方法

利用AccessibilityService(安卓的无障碍辅助功能)

步骤.

1.配置文件代码

<application>  
  <service android:name="你的无障碍辅助类名"  
      android:label="@string/accessibility_service_label">  
    <intent-filter>  
      <action android:name="android.accessibilityservice.AccessibilityService" />  
    </intent-filter>  
  </service>  
  <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />  
</application> 

2. 这个 meta-data元素指的是在应用程序的资源目录创建的一个XML文件。(/res/xml/accessibility_service_config.xml). 下面的代码显示了服务配置文件的示例内容:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
&nbsp; &nbsp; android:accessibilityEventTypes="typeAllMask"
&nbsp; &nbsp; android:accessibilityFeedbackType="feedbackGeneric"
&nbsp; &nbsp; android:accessibilityFlags="flagRequestFilterKeyEvents"
&nbsp; &nbsp; android:canRetrieveWindowContent="true"
&nbsp; &nbsp; android:canRequestFilterKeyEvents="true" &nbsp;
&nbsp; &nbsp; android:description="@string/accessibility_description"
&nbsp; &nbsp; android:notificationTimeout="100"/>

3.自己新建一个类去继承他并重写他的3个方法 假设你要监听按键的话就重写OnKeyEvent方法

public class RobMoney extends AccessibilityService {

    private static final String TAG = "dxj";
    private Calendar c = Calendar.getInstance();
    int flag=0;
    @Override
    protected boolean onKeyEvent(KeyEvent event) {
        Log.i(TAG, "onKeyEvent");
        int key = event.getKeyCode();

        switch(key){
        case KeyEvent.KEYCODE_VOLUME_DOWN:


            Intent downintent = new Intent("com.exmaple.broadcaster.KEYDOWN");
            downintent.putExtra("dtime", System.currentTimeMillis());
            if(flag==0){
            sendBroadcast(downintent);
            flag+=1;
            }else if (flag==1) {
                flag=0;
            }
            Log.i(TAG, "KEYCODE_VOLUME_DOWN");
            break;
        case KeyEvent.KEYCODE_VOLUME_UP:

            Intent upintent = new Intent("com.exmaple.broadcaster.KEYUP");
            upintent.putExtra("utime", System.currentTimeMillis());
            if(flag==0){
                sendBroadcast(upintent);
                flag+=1;
                }else if (flag==1) {
                    flag=0;
                }

        Log.i(TAG, "KEYCODE_VOLUME_UP");

            break;
            default:
                break;
        }
        return super.onKeyEvent(event);
    }

    @Override
    public void onInterrupt() {

    }

    @Override
    public void onCreate() {
        Log.i(TAG, "RobMoney::onCreate");
        super.onCreate();
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // TODO Auto-generated method stub

    }

}

5.再去配置文件里面注册一个广播或者动态注册,我这里的话是通过监听这个事件来发送一个广播,广播来处理事件

**源码:http://pan.baidu.com/share/link?shareid=2641899309&uk=4097462172**

以前还不会github。让大家见笑了2018.5.7