在我的应用程序中有一个 Service
和一个 AccessibilityService
。现在 Service
被无障碍服务绑定(bind)以接收信息。
我的 Service
会定期检查 AccessibilityService
是否已启用,如果未启用,它会向用户发送通知,告知它必须启用它。
启用后,AccessibilityService
开始工作。首先它绑定(bind)到我的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 操作系统没有重启它?
问题 2:我可以更改我的代码以检查 AccessibilityService
是否已启用但还有一个正在运行的实例吗?
最佳答案
为什么当 AccessibilityService
崩溃时 Android 操作系统不重启它?
我不知道,但我怀疑您对此无能为力。我在使用 AccessibilityService
时遇到过类似的问题,所以我认为这是正常行为。我能想到的最好的是:
- 仔细编写您的
AccessibilityService
代码并对其进行全面测试,使其不包含任何会导致其崩溃的错误。 - 不要在您的
AccessibilityService
中执行任何您也可以在其他地方执行的逻辑。您的AccessibilityService
所做的工作越少,它就越简单,因此出现错误的可能性就越小。 - 使您的
AccessibilityService
代码具有容错能力。预测服务内部将发生的错误,并编写代码来捕获它们并从中恢复,以便AccessibilityService
在可能的情况下继续正常运行。 - 在自己的进程中运行您的
AccessibilityService
,这样它就不会在您的其他代码崩溃时被终止。请注意,这可能很困难,具体取决于服务与其余代码的交互方式。
我可以更改我的代码以检查 AccessibilityService 是否已启用但还有一个正在运行的实例吗?
是的;有几种常用的技术可以做到这一点。参见 How to check if a service is running on Android? .
关于android - 崩溃后重启无障碍服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32157604/