在我的应用中,有一个Service
和一个AccessibilityService
。现在,Service
受可访问性服务的约束,以便接收信息。
我的Service
会定期检查AccessibilityService
是否已启用,如果未启用,则会向用户发送通知,说明它必须启用它。
启用后,AccessibilityService
开始有效。首先它绑定到我的Service
,之后,它开始发送信息。
问题是如果AccessibilityService
崩溃了。它仍然启用但没有正在运行的实例。因此我的Service
发现它已启用,但实际上AccessibilityService
未运行。
如何检查AccessibilityService
public boolean checkAccesibilityService()
{
int accessibilityEnabled = 0;
boolean accessibilityFound = false;
try {
accessibilityEnabled = Settings.Secure.getInt(
mContext.getApplicationContext().getContentResolver(),
android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
//Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
} catch (Settings.SettingNotFoundException e) {
Log.e(TAG, "Error finding setting, default accessibility to not found: "
+ e.getMessage());
}
if (accessibilityEnabled == 1) {
//Log.v(TAG, "***ACCESSIBILIY IS ENABLED*** -----------------");
String settingValue = Settings.Secure.getString(
mContext.getApplicationContext().getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
if (settingValue != null) {
if(TextUtils.isEmpty(settingValue)) {
Log.i(TAG, "Nessun servizio abilitato!");
return false;
}
TextUtils.SimpleStringSplitter splitter = new TextUtils.SimpleStringSplitter(':');
splitter.setString(settingValue);
while (splitter.hasNext()) {
String accessabilityService = splitter.next();
//Log.v(TAG, "-------------- > accessabilityService :: " + accessabilityService);
if (accessabilityService.equalsIgnoreCase(ACCESSIBILITY_SERVCE)) {
//Log.v(TAG, "Accessibility Service Attivato!");
return true;
}
}
Log.v(TAG, "Accesibility Service non abilitato!");
return false;
}
} else {
Log.v(TAG, "***ACCESSIBILIY IS DISABLED***");
}
return accessibilityFound;
}
Q1:为什么当AccessibilityService
崩溃导致Android操作系统无法重启?
Q2:我是否可以更改我的代码以检查AccessibilityService
是否已启用但是还有正在运行的实例?
答案 0 :(得分:6)
AccessibilityService
崩溃导致Android操作系统无法重启?我不知道,但我怀疑你无法做到这一点。我与AccessibilityService
有类似的问题,所以我认为这是正常行为。我能想到的最好的是:
AccessibilityService
代码并对其进行全面测试,使其不包含任何可能导致其崩溃的错误。AccessibilityService
中做任何你也可以在不同的地方做的逻辑。 AccessibilityService
正在做的工作越少,越简单,因此产生错误的可能性就越小。AccessibilityService
代码容错。预测将在服务中发生的错误,并编写代码以捕获它们并从中恢复,以便AccessibilityService
在可能的情况下继续正常运行。AccessibilityService
,这样当其他代码崩溃时它就不会被杀死。请注意,这可能很难,具体取决于服务如何与代码的其余部分进行交互。是;有几种常见的技术可以做到这一点。请参阅How to check if a service is running on Android?。
答案 1 :(得分:0)
您可以通过调用disableSelf()在handleUncaughtException(Application Class)中发生崩溃之前以编程方式关闭Accessibility Service。方法
但这只适用于Nogout及以上版本。