2013-05-13 2 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

+0

Какова была точная версия Android, в которой у вас была эта проблема? – Sam

ответ

2

я перед той же проблемой. После многих попыток я обнаружил, что эта проблема возникает в старой версии Android (например, Jellybean). когда устройство выключено, служба становится несвязанной. Но он не перепроверяется on_Boot_Completed. Поскольку эта проблема не появляется в новой версии Android, я рассматривал ее как ошибку для Android. Поскольку только способ повторной активации службы отключается и перезапускает службу, я использую sharedPreference, чтобы отслеживать состояния моего сервиса. когда onUnbindonRebind или onServiceConnected называется Я обновляю свой sharedPreference со значением I, связанным с ним. Теперь, прежде чем использовать сервис, я проверю, что если служба называется onRebind или onServiceConnected, если нет, то я говорю пользователю перезапустить службу или начать работать с моей службой.

Если вы так смущены, вы можете включить следующий код в свою службу доступности.

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 
}