2013-05-13 220 views
2

我有一个应用程序使用辅助功能服务来收听通知。它在用户重新启动后正常工作。如果重新启动,则必须禁用/重新启用辅助功能服务菜单中的服务。AccessibilityService在重新启动时停止接收事件

为什么应用程序在重新启动后没有得到事件?

@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

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accessibilityEventTypes="typeNotificationStateChanged" 
    android:packageNames="com.t3hh4xx0r.huenotifier" 
    android:accessibilityFeedbackType="feedbackAllMask" 
    android:notificationTimeout="100" 
    android:accessibilityFlags="flagDefault" 
    android:settingsActivity="com.t3hh4xx0r.huenotifier.activities.LoadingSplashActivity" 
    android:canRetrieveWindowContent="false" 
    android:description="@string/app_name" /> 

和清单

<service 
     android:name="com.t3hh4xx0r.huenotifier.MyAccessibilityService" 
     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/service_info" /> 
    </service> 
+0

怎么样这个问题? – crossle 2015-01-05 07:46:35

+0

你有这个问题的Android的确切版本是什么? – Sam 2015-06-12 10:44:20

回答

2

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

如果您很困惑,那么您可以将波纹管代码包含在无障碍服务中。

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 
} 
相关问题