2009-10-09 8 views
1

Пока у меня есть класс для простой локальной службы. То, что я хочу сделать, - , отправляет запросы в эту местную службу от различных видов деятельности в моей заявке. В зависимости от параметров этих запросов служба будет подключаться через HttpClient к веб-серверу и получать JSONObject и возвращать его в действие. Все HTTP-коммуникации уже работают в моей деятельности, но я бы хотел, чтобы запускался в отдельном потоке в моей локальной службе сейчас.Android: Как общаться и обмениваться объектами с помощью локальной службы?

Исходный код моего очень простой местной службы выглядит так до сих пор:

// BackgroundService.java 
package com.test.localservice; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 
public class BackgroundService extends Service 
{ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i("BackgroundService", "onCreate()"); 
     Thread thr = new Thread(null, new RunThread(), "BackgroundService"); 
     thr.start(); 
    } 
    class RunThread implements Runnable 
    { 
     public void run() { 
      Log.i("BackgroundService", "run()"); 

      /* Here the HTTP JSON communication is going to happen */ 

      //BackgroundService.this.stopSelf(); 
     } 
    } 
    @Override 
    public void onDestroy() 
    { 
     Log.i("BackgroundService", "onDestroy()"); 
     super.onDestroy(); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     Log.i("BackgroundService", "onStart()"); 
     super.onStart(intent, startId); 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     Log.i("BackgroundService", "onBind()"); 
     return null; 
    } 

} 

Проблема я столкнулся в настоящее время (из-за недостатка знаний) является частью связи Деятельность < - > Местное обслуживание. Я нашел некоторые примеры обмена данными и обмена объектами для Удаленная служба с использованием AIDL (Интерфейс определений интерфейса Android). Однако я не уверен, должен ли я идти по этому пути. Я просто хотел бы обменять мои собственные определенные объекты, или если это невозможно, просто JSONObject, или если это упростит ситуацию, даже простые массивы String будут работать (пока).

Может кто-нибудь указать мне в правильном направлении и, если возможно, дать простой пример обмена объектов (в обоих направлениях) с локальной службой.

Заранее спасибо.

ответ

5

Я предлагаю использовать AsyncTask вместо вашего собственного потока в этом сценарии.

Чтобы обеспечить активность ссылку на ваш BackgroundService объекта, ваши варианты:

  1. Используйте синглтон (то есть, сделать BackgroundService объект доступен из статического контекста, такие как публичный статический член данных, обнуление этой статической ссылки в onDestroy()).

  2. Следуйте за образцом API LocalServiceBinding, чтобы вернуть IBinder, который просто дает доступ к объекту BackgroundService.

Оттуда все находится в одном JVM, поэтому вы можете просто обходить объекты вокруг. Однако будьте осторожны, чтобы не удержать ничто за время жизни компонента (например, Activity не следует кэшировать синглтон).

+0

Спасибо. Образец API LocalServiceBinding фактически помог многим. Также AsyncTask был отличным намеком. Для тех, кто нуждается в помощи при потоковой обработке на Android, здесь есть хорошая запись в блоге от разработчиков: http://android-developers.blogspot.com/2009/05/painless-threading.html – znq

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

  • Нет связанных вопросов^_^