我实际上是在尝试在 Android 中创建一个 SystemService。我读到从应用程序到此服务的相互通信应该由处理程序处理?
那么如何从服务函数返回一些对象给调用应用程序呢?如何处理。
为了让我的问题更清楚,假设我有一个具有以下方法定义的服务 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 实例调用此方法并像传统方式一样正常处理吗?或者我是否必须与极不可能的处理程序一起工作(我相信)。请告诉我处理这种情况的最佳流程。
谢谢
最佳答案
您不必使用处理程序来执行任何操作。如果您已经创建了一个描述与服务通信的 AIDL 文件,那么您就大功告成了:接下来您要做的就是在您的服务中实现 AIDL 方法。 当 Android“编译器”将 AIDL 翻译成 java 代码时,您的功能将全部阻塞(客户端将等待服务完成方法)。 如果您专门添加关键字“oneway”,则方法调用不会被阻塞。 您应该查看 Google 关于 IBinder 的文档以更好地理解事情。
关于android - 从 App 到 Android 中的 SystemService 的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22827098/