您的位置:首页 > 其它

安卓后台监听按键事件

2017-04-20 18:22 3591 查看

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

        我们都知道要做监听的话首先需要去重写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;
@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 
小电影网站:www.233movie.xyz

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐