1

私は本質的に Android で SystemService を作成しようとしています。アプリからこのサービスへの相互通信はハンドラーによって処理されるべきだと読みましたか?

では、Service の関数から呼び出し元のアプリに何らかのオブジェクトを返すのはどうでしょうか? これはどのように処理できますか。

私の質問をより明確にするために、次のメソッド定義を持つ Service TestService があると想像してください。

public class TestService extends ITestService.Stub {
public TestService(Context context) {
        super();
        mContext = context;
        mWorker = new TestWorkerThread("TestServiceWorker");
        mWorker.start();
        Log.i(TAG, "Spawned worker thread");
    }
public void setValue(int val) {
        Message msg = Message.obtain();
        msg.what = TestWorkerHandler.MESSAGE_SET;
        msg.arg1 = val;
        mHandler.sendMessage(msg);
}

public Object getValue() {
     // ********************* QUESTION HERE *****************
    // Can I call this method directly??
    // Or do I have to process this through the handler?????
}
private class TestWorkerThread extends Thread {
        public TestWorkerThread(String name) {
            super(name);
        }
        public void run() {
            Looper.prepare();
            mHandler = new TestWorkerHandler();
            Looper.loop();
        }
    }
    private class TestWorkerHandler extends Handler {
        private static final int MESSAGE_SET = 0;
        @Override
        public void handleMessage(Message msg) {
            try {
                if (msg.what == MESSAGE_SET) {
                    Log.i(TAG, "set message received: " + msg.arg1);
                }
            } catch (Exception e) {
                // Log, don't crash!
                Log.e(TAG, "Exception in TestWorkerHandler.handleMessage:", e);
            }
        }
    }
}

これは、同期するために上記から私が理解していることです。通常、setValue を handleMessage() の一部として実行します。

Service インスタンスを使用してこのメ​​ソッドを呼び出し、従来の方法と同様に通常どおり処理できる getValue メソッドについてはどうでしょうか。または、非常にありそうもないハンドラーを使用する必要がありますか (私は信じています)。このシナリオで対処するための最良のプロセスを教えてください。

ありがとう

4

1 に答える 1

1

そのためにハンドラーを使用する必要はありません。サービスとの通信を記述する AIDL ファイルを作成したら、作業は完了です。次に行う必要があるのは、サービス内に AIDL メソッドを実装することだけです。AIDL が Android の「コンパイラ」によって Java コードに変換されると、関数はすべてブロックされます (クライアントはサービスがメソッドを終了するのを待ちます)。キーワード「oneway」を具体的に追加すると、メソッド呼び出しはブロックされません。もう少しよく理解するには、IBinder に関する Google のドキュメントを参照してください。

于 2014-04-03T13:47:05.193 に答える