Android 向けのアクセシビリティ サービスを開発しています。問題は、エミュレーター (Android 4.0.5 API 15) で実行している場合、サービスがオフになっているときに onUnbind が呼び出されないことがあることです。この場合、サービスを停止することはできず、apk を再インストールするか、エミュレーターを再起動する必要があります。
このアクセシビリティ サービスを実際のデバイス (Galaxy Nexus) で実行すると、問題なく動作します。この問題を再現できませんでした。
関連するサービス コードは次のとおりです。
public class MyService extends AccessibilityService {
boolean mRunning= false;
private void init() {
if (mRunning) {
// if execution reaches this point means that onUnbind was
// not called the last time the service has been switched off
return;
}
/**
* Unsubscribe all accessibility events. Cannot be removed directly from
* @xml/accessibilityservice, otherwise onUnbind and onDestroy // never
* get called
*/
setServiceInfo(new AccessibilityServiceInfo());
// Initialization stuff
mRunning= true;
}
private void cleanup() {
if (!mRunning) return;
// cleanup stuff
mRunning= false;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onServiceConnected() {
init();
}
@Override
public boolean onUnbind(Intent intent) {
cleanup();
return false;
}
@Override
public void onDestroy() {
super.onDestroy();
cleanup();
}
}
質問:
- 何か不足していますか?
- これがいつ発生するかを検出できます( init() に関するコメントを参照)。サービスを強制的に停止する方法はありますか?
追加の詳細:
- サービスにはネイティブ部分が含まれており、2 つのスレッドが生成されます
- エミュレーターでは CPU の 100% を消費し、Galaxy Nexus では約 35% を消費します。
- 最初に失敗した後、サービスのオンとオフを何度切り替えても、onUnbind が再度呼び出されることはありません。