2010-08-17 9 views
1

Я сделал приложение на основе приложения удаленной службы android API, которое использует обратные вызовы для уведомления об основной деятельности для изменений, приложение отлично работает, передавая только одно значение int из удаленного сервиса обратно в действие. Проблема в том, что я хочу передать некоторые строки, а не обратно, чтобы обновить интерфейс activiti, как я могу это сделать? Я думал о возврате объекта, но есть недостаток документации и не знаю, как и если это возможно.callback обратного вызова android

ответ

0

Вы можете передавать строки по умолчанию, и вы должны смотреть на Parcelable объектов (там нет недостатка документации)

+0

Как передать строки, можете ли вы направить мой учебник или пример? документация не работала для меня. В примерах sdk в RemoteServiceBinding вы реализуете метод, определяющий интерфейс обратного вызова: public voidvalueChanged (intvalue) {mHandler.sendMessage (mHandler.obtainMessage (BUMP_MSG, value, 0)); }, который передает возвращаемое значение int объекту Message, а затем просто обновляет ui внутри обработчика, меняет метод внутри интерфейса и теперь принимает строки, но я не могу обновить интерфейс от метода ValueChanged, и я не могу передать строки в Message объект. – maxsap

+0

http://developer.android.com/guide/developing/tools/aidl.html – fedj

+0

Я знаю, что в этой статье он просто описывает, что делается на примере RemoteService, не очень помог мне, поскольку он показывает только, как передать аргумент arg и просто говорит о том, что пакеты не показывают, как это сделать! – maxsap

2

Ok просто понять это, я вывешиваю решение для того, чтобы помочь другим с подобной проблемой ,

1. Вам нужно сделать отдельный файл помощи, содержащий только содержащийся объект (см. Ссылку в комментариях выше).

  1. Второй в интерфейсе обратного вызова импортирует этот интерфейс, а затем добавляет его в качестве параметра.
  2. , когда вы реализуете метод из интерфейса обратного вызова в своем классе активности, добавьте возвращаемый объект (это будет анализируемый объект) в качестве объекта сообщения и отправьте это сообщение.
  3. в обработчике просто размонтируйте объект и используйте его.

Это пример кода:

интерфейс объекта The Parcable в:

package sap.max; 
    parcelable ParcableInfo; 

Интерфейс Callback:

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 –

Смежные вопросы