Android: Wie kommuniziert und Austauschobjekte mit einem Service vor Ort?
-
20-09-2019 - |
Frage
Bisher habe ich eine Klasse für einen einfachen Service vor Ort. Was ich tun möchte, ist auf Sendeaufträge zu dieser lokalen Service aus verschiedenen activies in meiner Anwendung. In Abhängigkeit von den Parametern dieser Anforderungen wird der Dienst eine Verbindung über Httpclient auf einen Webserver und erhalten ein JSONObject und senden es an die Aktivität. All HTTP-Kommunikation arbeitet bereits in meiner Tätigkeit, aber ich mag es in einem separaten Thread in meinem lokalen Dienst ausführen jetzt.
Der Quellcode meiner sehr einfachen lokalen Service sieht wie folgt aus so weit:
// 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;
}
}
Das Problem, das ich jetzt mit Blick auf bin (aufgrund eines Mangels an Wissen) ist der Kommunikationsteil Aktivitäten <-> Service vor Ort . Ich fand einige Kommunikation und Objektaustausch Beispiele für einen Remote Service mit
Lösung Ich würde vorschlagen, eine Um eine Aktivität einen Verweis auf Ihre Verwenden Sie einen Singleton (das heißt, machen Sie Ihr Mit der unten stehenden Von dort aus ist alles in der gleichen JVM, so dass Sie nur Objekte herumgehen können. Seien Sie aber vorsichtig, nicht zu halten, auf irgendetwas über die Lebensdauer der Komponenten (zum Beispiel AsyncTask
statt Ihren eigenen Thread in diesem Szenario verwendet wird. BackgroundService
Objekt zu geben, Ihre Optionen sind:
BackgroundService
Objekt aus einem statischen Kontext zur Verfügung, wie ein öffentlichen statischen Datenelement, nulling darauf hin, dass statische Referenz in onDestroy()
). LocalServiceBinding
API Probe eines IBinder
zurückzukehren, dass nur Zugriff auf das BackgroundService
Objekt gibt. Activity
sollte nicht die Singleton-Cache).