2010-08-17 113 views
1

我已經做了一個基於android API的遠程服務應用程序的應用程序,它使用回調來通知主要活動的變化,應用程序工作正常,只是從遠程服務返回一個單一的int值返回到活動。 問題是,我想傳遞一些字符串,而不是int回來更新activiti的用戶界面,我該怎麼做?我曾想過要返回一個對象,但缺少文檔,不知道如何或是否有可能。安卓服務回調

回答

0

您可以通過默認傳遞字符串,你應該看看到Parcelable對象(不乏文檔)

+0

我怎樣才能傳遞字符串,你可以指向我的教程或例子? 該文檔對我無效,在RemoteServiceBinding的sdk示例中,您實現了定義回調接口的方法,代碼是:public voidvalueChanged(intvalue){mHandler.sendMessage(BUMP_MSG,value,0)); }它將返回的int值傳遞給Message對象,然後簡單地更新處理程序中的UI,我已經改變了接口內的方法並且現在接受了字符串,但是我無法從ValueChanged方法更新UI,並且我無法將字符串傳遞給Message目的。 – maxsap 2010-08-17 13:29:46

+0

http://developer.android.com/guide/developing/tools/aidl。html – fedj 2010-08-17 14:27:46

+0

我知道那篇文章,它只是描述了RemoteService示例做了什麼並沒有多大幫助,因爲它只顯示瞭如何傳遞arg返回,並且只是說關於不顯示如何執行它的parcables! – maxsap 2010-08-17 14:33:49

2

好吧只是弄清楚,我張貼,以幫助其他人有類似問題的解決方案。

1.您需要製作一個單獨的aidl文件,其中只包含可分區對象(請參閱上面註釋中的鏈接)。

  1. 第二次在回調界面導入該界面,然後將其添加爲參數。
  2. 當您在活動類的回調接口中實現該方法時,將返回的對象(這將是可解析對象)作爲消息對象併發送該消息。
  3. 在處理程序中解開對象並使用它。

這是一個示例代碼:

的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); 
     } 
    } 

}; 

希望這會幫助別人,感謝您的幫助fedj。

0

我創建了一個包含了簡單的「ParcableInfo.aidl」文件:

package my.package.name; 
parcelable ParcableInfo; 

然而,當我建「ParcableInfo.java」沒有在「根」文件夾中生成項目。

+0

我想通了:在與maxsap的ParcableInfo.aidl相同的文件夾中,我需要創建ParcableInfo.java實現Parcelable ...對於此實現的示例,請參閱:http://developer.android.com/reference/android /os/Parcelable.html – 2010-12-22 23:56:44