Android: как общаться и обмениваться объектами с локальной службой? - PullRequest
1 голос
/ 09 октября 2009

Пока у меня есть класс для простого местного обслуживания. Я хочу отправлять запросы на этот локальный сервис из разных активностей в моем приложении. В зависимости от параметров этих запросов служба подключится через HttpClient к веб-серверу, получит JSONObject и вернет его в действие. Вся HTTP-связь уже работает в моей деятельности, но я бы хотел, чтобы запускался в отдельном потоке в моей локальной службе сейчас.

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

// 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;
    }

}

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

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

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

1 Ответ

5 голосов
/ 09 октября 2009

В этом сценарии я бы предложил использовать AsyncTask вместо собственного потока.

Чтобы дать деятельности ссылку на ваш объект BackgroundService, вы можете выбрать:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...