1

我实际上是在尝试在 Android 中创建一个 SystemService。我读到从应用程序到该服务的相互通信应该由处理程序处理?

那么如何将一些对象从服务的函数返回给调用应用程序呢?这怎么可能处理。

为了让我的问题更清楚,想象一下我有一个带有以下方法定义的 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() 的一部分执行

getValue 方法可以使用 Service 实例调用该方法并像我们传统上那样正常处理它吗?还是我必须与极不可能的处理程序合作(我相信)。请让我知道在这种情况下处理的最佳过程。

谢谢

4

1 回答 1

1

您不必使用处理程序来执行任何操作。如果您创建了一个描述与服务通信的 AIDL 文件,那么您就完成了:接下来您要做的就是在您的服务中实现 AIDL 方法。当 AIDL 被 Android“编译器”翻译成 java 代码时,你的函数都会被阻塞(客户端将等待服务完成方法)。如果您专门添加关键字“oneway”,则方法调用将不会被阻塞。你应该查看谷歌关于 IBinder 的文档以更好地理解事情。

于 2014-04-03T13:47:05.193 回答