Android上实现多个辅助服务
2015-12-31 14:05
423 查看
辅助服务一个应用只能对应一个,最近应用上加一个辅助服务,原来的代码又不能改,就自己做假的多个辅助服务了。
自己写同样的服务接口,实现后,注册到一个公共的辅助服务上,就感觉可以实现多个辅助服务了。
自定义辅助服务的接口,主要就这几个方法了。
一个空的实现如下,用了单例。
自定义的辅助服务就在代码中静态注册就行了:
一个简单的封装就实现了一个变多个了。
自己写同样的服务接口,实现后,注册到一个公共的辅助服务上,就感觉可以实现多个辅助服务了。
自定义辅助服务的接口,主要就这几个方法了。
/** * Created by AndyMao on 2015/12/15. */ public interface IAccess { void onAccessibilityEvent(final AccessibilityEvent event,Context context); void onServiceConnected(); void onInterrupt(); boolean onUnbind(Intent intent); void onCreate(); void onDestroy(); }
一个空的实现如下,用了单例。
</pre><pre name="code" class="java">public class MyAccessibilityService implements IAccess { private static MyAccessibilityService instance; public static MyAccessibilityService getInstance() { if (instance == null) { instance = new MyAccessibilityService(); } return instance; } @Override public void onAccessibilityEvent(AccessibilityEvent event,Context context) { } @Override public void onServiceConnected() { } @Override public void onInterrupt() { } @Override public boolean onUnbind(Intent intent) { return false; } @Override public void onCreate() { } @Override public void onDestroy() { } }
真正的服务辅助在这里,主要就是在各个方法上回调已注册的自定义服务的对应方法。要注意的是同步各个方法,主要是注册和回调同时执行的话,就会报错了,虽然概率比较小。
/** * Created by AndyMao on 2015/12/15. */ public class CommonAccessibilityService extends AccessibilityService { private static List<IAccess> sAccessList = new ArrayList<>(); private static Integer sLockAccessList = new Integer(0); public static void registerAccessibilityService(IAccess iAccess) { synchronized (sLockAccessList) { if (iAccess != null) { sAccessList.add(iAccess); } } } @Override public void onAccessibilityEvent(final AccessibilityEvent event) { synchronized (sLockAccessList) { for (IAccess access : sAccessList) { access.onAccessibilityEvent(event, getApplicationContext()); } } } @Override protected void onServiceConnected() { synchronized (sLockAccessList) { for (IAccess access : sAccessList) { access.onServiceConnected(); } } } @Override public void onInterrupt() { synchronized (sLockAccessList) { for (IAccess access : sAccessList) { access.onInterrupt(); } } } @Override public boolean onUnbind(Intent intent) { synchronized (sLockAccessList) { for (IAccess access : sAccessList) { access.onUnbind(intent); } } return super.onUnbind(intent); } @Override public void onCreate() { super.onCreate(); synchronized (sLockAccessList) { for (IAccess access : sAccessList) { access.onCreate(); } } } @Override public void onDestroy() { super.onDestroy(); synchronized (sLockAccessList) { for (IAccess access : sAccessList) { access.onDestroy(); } } } }辅助服务的xml注册:
<service android:name=".accessibility.CommonAccessibilityService" android:enabled="@bool/atLeastIceCreamSandwich" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_config" /> </service>
<pre name="code" class="html"><accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"</span> android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackGeneric" android:canRetrieveWindowContent="true" android:description="@string/accessibility_tips" android:notificationTimeout="100" />
自定义的辅助服务就在代码中静态注册就行了:
CommonAccessibilityService.registerAccessibilityService(MyAccessibilityService.getInstance());
一个简单的封装就实现了一个变多个了。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories