AccessibilityService在重新启动时停止接收事件

我有一个使用辅助function服务来收听通知的应用。 它可以在用户重新启动后正常工作。 如果重新启动,则必须从辅助function服务菜单中禁用/重新启用该服务。

为什么应用程序在重启后无法获取事件?

@Override protected void onServiceConnected() { pMan = new PreferencesManager(this); bulbManager = new BulbManager(((Context) this), pMan.getBridge()); AccessibilityServiceInfo info = new AccessibilityServiceInfo(); info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED; info.notificationTimeout = 100; info.feedbackType = AccessibilityEvent.TYPES_ALL_MASK; setServiceInfo(info); Log.d("OMG, STARTED FINALLY!", "RIGHT NOW!"); } 

和xml

  

和清单

        

我遇到了同样的问题。 经过大量的尝试,我发现这个问题发生在旧版本的android(例如,豆豆)。 当设备断电时,服务被解除绑定。 但它没有被on_Boot_Completed on_Boot_Completed 。 由于这个问题没有出现在较新版本的android上,我认为它是一个android bug。 因为只有重新激活服务的方法是关闭并重新启动服务,我使用sharedPreference来跟踪我的服务状态。 当onUnbind onRebindonServiceConnected被调用时,我用我关联的值更新我的sharedPreference 。 现在,在使用服务之前,我检查如果服务调用onRebindonServiceConnected如果没有,那么我告诉用户重启服务或开始使用我的服务。

如果您感到困惑,可以在您的辅助function服务中包含以下代码。

 public static String AccessibilityPreference="AccessibilityPreference"; public static String isServiceBinded="isServiceBinded"; @Override public void onServiceConnected() { Log.e(TAG, "ACC::onServiceConnected:************************* "); SharedPreferences p=getSharedPreferences(AccessibilityPreference,Context.MODE_PRIVATE); SharedPreferences.Editor e=p.edit(); e.putBoolean(isServiceBinded,true); e.commit(); } @Override public boolean onUnbind(Intent intent) { Log.e("onUnbind","onUnbind Called***************************************************"); SharedPreferences p=getSharedPreferences(AccessibilityPreference,Context.MODE_PRIVATE); SharedPreferences.Editor e=p.edit(); e.putBoolean(isServiceBinded,false); e.commit(); return super.onUnbind(intent); } @Override public void onRebind(Intent intent) { Log.e("onRebind","onRebind Called***************************************************"); SharedPreferences p=getSharedPreferences(AccessibilityPreference,Context.MODE_PRIVATE); SharedPreferences.Editor e=p.edit(); e.putBoolean(isServiceBinded,true); e.commit(); super.onRebind(intent); } public static boolean isServiceBinded(SharedPreferences preferences){ return preferences.getBoolean(isServiceBinded,true); } 

然后在开始使用服务之前检查服务是否有效,如下所述,

 if(AccessibilityWorkService.isServiceBinded(getSharedPreferences(AccessibilityWorkService.AccessibilityPreference, Context.MODE_PRIVATE))){ //start working }else { //tell user to restart service }