Андроид:Как общаться и обмениваться объектами с локальной службой?

StackOverflow https://stackoverflow.com/questions/1542499

Вопрос

На данный момент у меня есть класс для простой локальной службы.Что я хочу сделать, так это отправлять запросы в эту местную службу от разных занятий в моем приложении.В зависимости от параметров этих запросов сервис подключится через 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;
    }

}

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

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

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

Это было полезно?

Решение

Я бы предложил использовать AsyncTask вместо вашей собственной темы в этом сценарии.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top