3

我有一个使用无障碍服务来收听通知的应用程序。它可以正常工作,直到用户重新启动。如果您重新启动,您必须从无障碍服务菜单中禁用/重新启用该服务。

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

@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>
4

1 回答 1

2

我面临同样的问题。经过大量尝试后,我发现旧版本的android(例如Jellybean)会出现此问题。当设备关闭时,服务将被解除绑定。但它没有重新绑定on_Boot_Completed。由于这个问题没有出现在较新版本的 android 上,我认为它是一个 android 错误。因为重新激活服务的唯一方法是关闭并重新启动服务,所以我使用sharedPreference它来跟踪我的服务状态。当onUnbind onRebind或被onServiceConnected调用时,我sharedPreference用我为它关联的值更新我的值。现在,在使用服务之前,我检查是否调用了服务,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
}
于 2016-09-20T12:07:48.060 回答