2012-05-23 2 views
3

Я создаю Instant Messenger для Android с помощью asmack. Я начал службу чата, которая подключается к серверу xmpp. сервис подключается к серверу xmpp, и я получаю список и наличие. , но теперь мне нужно обновить интерфейс и передать список объектов учетной записи из службы в действие. я столкнулся с Parcelable и сериализуемым. Я не могу понять, что является правильным способом для этой службы. Может ли кто-нибудь предоставить некоторые примеры кода, где я могу сделать то же самое.Android Передача пользовательского объекта из службы в действие

Thanks

+1

http://stackoverflow.com/questions/3747448/android-passing-data-between-service-and-activity или http://stackoverflow.com/questions/9239240/passing -объект-через-намерение-от-фона-службы-к-активности –

ответ

1

Вы делаете приятное приложение. Я не знаю больше о smack, но я знаю, как передавать объекты из службы в Activity. Вы можете сделать AIDL для вашей службы. AIDL передаст ваши объекты обслуживания в действие. А затем вы можете обновить свой интерфейс активности. Это может быть полезно вам link!

Сначала вам нужно сделать файл .aidl, используя ваш редактор, и сохранить этот файл на рабочем столе. AIDL - это как интерфейс больше ничего. Мол, ObjectFromService2Activity.aidl

package com.yourproject.something 

// Declare the interface. 
interface ObjectFromService2Activity { 
    // specify your methods 
    // which return type is object [whatever you want JSONObject] 
    JSONObject getObjectFromService(); 

} 

Теперь скопируйте этот файл и вставить его в папку проекта и плагин ADT будет генерировать интерфейс ObjectFromService2Activity и заглушки автоматически в GEN/папке.

SDK для Android также включает в себя вспомогательную утилиту (в командной строке) (в каталоге tools /), которую вы можете использовать для генерации кода Java, если вы не используете Eclipse.

Переопределить метод obBind() в вашем сервисе. Мол, Service1.java

public class Service1 extends Service { 
private JSONObject jsonObject; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.d(TAG, "onCreate()"); 
    jsonObject = new JSONObject(); 
} 

@Override 
public IBinder onBind(Intent intent) { 

return new ObjectFromService2Activity.Stub() { 
    /** 
    * Implementation of the getObjectFromService() method 
    */ 
    public JSONObject getObjectFromService(){ 
    //return your_object; 
    return jsonObject; 
    } 
}; 
} 
@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.d(TAG, "onDestroy()"); 
} 
} 

Запустите службу, используя вашу деятельность или где вы хотите, чтобы начать эту услугу и сделать ServiceConnection. Мол,

Service1 s1; 
private ServiceConnection mConnection = new ServiceConnection() { 
    // Called when the connection with the service is established 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     // Following the example above for an AIDL interface, 
     // this gets an instance of the IRemoteInterface, which we can use to call on the service 
     s1 = ObjectFromService2Activity.Stub.asInterface(service); 
    } 

    // Called when the connection with the service disconnects unexpectedly 
    public void onServiceDisconnected(ComponentName className) { 
     Log.e(TAG, "Service has unexpectedly disconnected"); 
     s1 = null; 
    } 
}; 

Использование объекта ObjectFromService2Activity вы можете получить доступ к методу s1.getObjectFromService() возвращает JSONObject. More Help Забава!

+0

Спасибо за помощь Ваяпарвин. – navraj

+0

Я также посмотрел на вещателя, поскольку он способен передавать объекты через Intent посредством сериализуемого дополнительного. Есть ли способ передать объект с помощью этого метода? также у вас есть хороший пример помощи? – navraj

+0

Когда вам нужно выполнить IPC, использование Messenger для вашего интерфейса проще, чем реализация его с помощью AIDL, поскольку Messenger ставит в очередь все вызовы службы, тогда как чистый интерфейс AIDL отправляет одновременные запросы в службу, которые затем должны обрабатывать мульти- резьб. Для большинства приложений службе не требуется выполнять многопоточность, поэтому использование Messenger позволяет службе обрабатывать один вызов одновременно. Если важно, чтобы ваш сервис был многопоточным, вам следует использовать AIDL для определения вашего интерфейса. – Mahesh

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