android服务回调

时间:2010-08-17 11:00:59

标签: android

我已经基于android API的远程服务应用程序创建了一个应用程序,它使用回调来通知主要活动的更改,应用程序可以很好地将一个int值从远程服务传递回活动。 问题是我想传递一些字符串而不是int,以便更新activiti的UI,我该怎么做?我想过返回一个对象,但是缺少文档,不知道如何或者是否可能。

3 个答案:

答案 0 :(得分:2)

好的,想一想,我发布解决方案是为了帮助其他有类似问题的人。

1.您需要创建一个仅包含parcable对象的单独的aidl文件(请参阅上面评论中的链接)。

  1. 第二个在回调接口中导入该接口,然后将其添加为参数。
  2. 当您从活动类的回调接口实现该方法时,将返回的对象(这将是可解析的对象)添加为Message对象并发送该消息。
  3. 处理程序中的
  4. 只需解组对象并使用它。
  5. 这是一个示例代码:

    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”。