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

时间:2013-05-13 00:14:37

标签: java android 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>

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。经过大量的尝试,我发现这个问题发生在旧版本的android(例如,豆豆)。当设备断电时,服务将被解除绑定。但它没有被重新定位on_Boot_Completed。由于这个问题没有出现在较新版本的android上,我认为它是一个android bug。因为只有重新激活服务的方法是关闭并重新启动服务,所以我使用sharedPreference来跟踪我的服务状态。在调用onUnbind onRebindonServiceConnected时,我使用与之关联的值更新sharedPreference。现在,在使用服务之前,我会检查该服务是否为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
}