我有一个使用辅助功能服务来收听通知的应用。它可以在用户重新启动后正常工作。如果重新启动,则必须从辅助功能服务菜单中禁用/重新启用该服务。
为什么应用程序在重启后无法获取事件?
@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 :(得分:2)
我遇到了同样的问题。经过大量的尝试,我发现这个问题发生在旧版本的android(例如,豆豆)。当设备断电时,服务将被解除绑定。但它没有被重新定位on_Boot_Completed
。由于这个问题没有出现在较新版本的android上,我认为它是一个android bug。因为只有重新激活服务的方法是关闭并重新启动服务,所以我使用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
}