我已经基于android API的远程服务应用程序创建了一个应用程序,它使用回调来通知主要活动的更改,应用程序可以很好地将一个int值从远程服务传递回活动。 问题是我想传递一些字符串而不是int,以便更新activiti的UI,我该怎么做?我想过返回一个对象,但是缺少文档,不知道如何或者是否可能。
答案 0 :(得分:2)
好的,想一想,我发布解决方案是为了帮助其他有类似问题的人。
1.您需要创建一个仅包含parcable对象的单独的aidl文件(请参阅上面评论中的链接)。
这是一个示例代码:
Parcable的对象界面:
package sap.max;
parcelable ParcableInfo;
回调界面:
package sap.max;
import sap.max.ParcableInfo;
/**
* A callback interface used by IMonitorService to send
* synchronous notifications back to its clients. Note that this is a
* one-way interface so the server does not block waiting for the client.
*/
oneway interface IRemoteServiceCallback {
/**
* Called when the service has a new value for you.
*/
void valueChanged(in ParcableInfo info);
}
服务的操作(注意这只是服务将调用的不完整代码):
private final Handler mHandler = new Handler() {
@Override public void handleMessage(Message msg) {
switch (msg.what) {
// It is time to bump the value!
case REPORT_MSG: {
// Up it goes.
int value = ++mValue;
// Broadcast to all clients the new value.
final int N = mCallbacks.beginBroadcast();
for (int i=0; i<N; i++) {
try {
ParcableInfo parceInfo = new ParcableInfo(telephonyManager.getSubscriberId() );
parceInfo.setID(telephonyManager.getSubscriberId());
mCallbacks.getBroadcastItem(i).valueChanged(parceInfo);
} catch (RemoteException e) {
// The RemoteCallbackList will take care of removing
// the dead object for us.
}
}
mCallbacks.finishBroadcast();
// Repeat every 3 second.
sendMessageDelayed(obtainMessage(REPORT_MSG), 1*3000);
} break;
default:
super.handleMessage(msg);
}
}
};
最后活动部分:
private IRemoteServiceCallback mCallback = new IRemoteServiceCallback.Stub() {
@Override
public void valueChanged(ParcableInfo info) throws RemoteException {
CellInfo cellInfo = new CellInfo(null, null, null, null, null, null, null);
cellInfo.setDeviceId(info.ID);
Message msg = mHandler.obtainMessage(BUMP_MSG, info);
mHandler.sendMessage(msg);
}
消息由以下人员处理:
//this is the handler for the service...
private Handler mHandler = new Handler() {
@Override public void handleMessage(Message msg) {
switch (msg.what) {
case BUMP_MSG:
ParcableInfo info = (ParcableInfo) msg.obj;
configView.setText(info.ID);
Toast.makeText(AntiTheft.this, "Received from service: " + info.ID,
Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
}
}
};
希望这有助于其他人,谢谢你的帮助。
答案 1 :(得分:0)
你可以默认传递字符串,你应该看看Parcelable对象(不缺少文档)
答案 2 :(得分:0)
我创建了简单的“ParcableInfo.aidl”文件,其中包含:
package my.package.name;
parcelable ParcableInfo;
但是,当我构建项目时,“gen”文件夹中没有生成“ParcableInfo.java”。