2013-05-13 50 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 
}