2

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 が再度呼び出されることはありません。
4

0 に答える 0