Андроид:Как общаться и обмениваться объектами с локальной службой?
-
20-09-2019 - |
Вопрос
На данный момент у меня есть класс для простой локальной службы.Что я хочу сделать, так это отправлять запросы в эту местную службу от разных занятий в моем приложении.В зависимости от параметров этих запросов сервис подключится через 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
объект, ваши варианты:
Используйте синглтон (т. е. сделайте свой
BackgroundService
объект, доступный из статического контекста, например общедоступный статический элемент данных, обнуляющий эту статическую ссылку вonDestroy()
).Следовать
LocalServiceBinding
Пример API для возвратаIBinder
который просто дает доступ кBackgroundService
объект.
Далее все находится в одной JVM, поэтому вы можете просто передавать объекты.Однако будьте осторожны и не удерживайте что-либо после окончания срока службы компонента (например, Activity
не должен кэшировать синглтон).