安卓后台监听按键事件

来源:互联网 发布:蜡笔小新 画风 知乎 编辑:程序博客网 时间:2024/06/04 18:35

    写这篇文章的原因是之前接到一个项目,要求是通过音量键来修改时间。这篇博客就是针对这个,源码链接在下面。

        我们都知道要做监听的话首先需要去重写Activity的OnkeyDown方法,然而这种办法只有当Activity在前台的时候才能用!在后台的话就不行了,这个项目我试过4种方法,1种可用!
1.用Service来绑定需要监听按键的Activity
2.自己注册一个广播来监听音量的变化(这个可以用,但是不太准确,比如音量最大了怎么办,最小了怎么办)
3.利用多线程(但是由于技术原因和各种原因还是失败,中间问过挺多人,他们也做过但都放弃了这个项目)

可以用的方法


你可以利用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"    android:accessibilityEventTypes="typeAllMask"    android:accessibilityFeedbackType="feedbackGeneric"    android:accessibilityFlags="flagRequestFilterKeyEvents"    android:canRetrieveWindowContent="true"    android:canRequestFilterKeyEvents="true"      android:description="@string/accessibility_description"    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;@Overrideprotected 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);}@Overridepublic void onInterrupt() {}@Overridepublic void onCreate() {Log.i(TAG, "RobMoney::onCreate");super.onCreate();}@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// TODO Auto-generated method stub}}
5.再去配置文件里面注册一个广播或者动态注册,我这里的话是通过监听这个事件来发送一个广播,广播来处理事件 (直接给整个源码了,反正很简单)

 百度云盘:http://pan.baidu.com/share/link?shareid=2641899309&uk=4097462172 
小电影网站:www.233movie.xyz


  




2 0
原创粉丝点击