Ich erstelle eine Anwendung, deren einzige Komponente eine service
ist, die im Hintergrund läuft (im Wesentlichen ein Proxyserver), aber ich finde keinen Weg, wie Sie diesen Dienst starten können. Die Anwendung kann keine Benutzeroberfläche oder Benutzerinteraktion haben, daher verwende ich keine Aktivität.Broadcast receiver
kann BOOT-Sendungen abhören, aber wie starte ich den Service zum ersten Mal, wenn er installiert ist, und wie kann ich ihn weiter betreiben? Oder gibt es eine Sendung, die ich nach der Installation der App anhören kann, z. mag TIME_TICK sein, aber das muss von meiner Aktivität aus registriert werden.
Leider gibt es momentan keine zuverlässige Möglichkeit, ein Broadcast-Ereignis zu empfangen, nachdem Ihr Anwendungsprogramm installiert wurde. Das ACTION_PACKAGE_ADDED Intent sendet nicht an das neu installierte Paket.
Um das Ereignis ACTION_BOOT_COMPLETED zu erhalten, müssen Sie eine Rundfunkempfängerklasse sowie Ihren Dienst haben. Ich würde auch empfehlen, die ACTION_USER_PRESENT - Absicht hinzuzufügen, um von diesem Rundfunkempfänger abgefangen zu werden. Dies erfordert Android 1.5 (minSDK = 3). Dies ruft Ihren Rundfunkempfänger immer dann auf, wenn der Benutzer das Telefon entsperrt. Das Letzte, was Sie tun können, um den Dienst aufrecht zu erhalten, ohne dass er automatisch heruntergefahren werden muss, ist das Aufrufen von Service.setForeground () in Ihrem Dienst onCreate, um Android mitzuteilen, dass Ihr Dienst nicht angehalten werden sollte. Dies wurde hauptsächlich für MP3-Player-Dienste hinzugefügt, die ständig ausgeführt werden müssen, aber von jedem Dienst verwendet werden können.
Stellen Sie sicher, dass Sie die richtigen Berechtigungen für die Ereignisse boot_complete und user_present in Ihrem Manifest hinzufügen.
Hier ist eine einfache Klasse, die Sie als Rundfunkempfänger für die Ereignisse verwenden können.
package com.snctln.util.WeatherStatus;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
public class WeatherStatusServiceReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if(intent.getAction() != null)
{
if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
intent.getAction().equals(Intent.ACTION_USER_PRESENT))
{
context.startService(new Intent(context, WeatherStatusService.class));
}
}
}
};
Viel Glück.
Rückgabe START_STICKY
in Service.onStartCommand
Android startet Ihren Dienst neu
Ich forsche zum selben Thema. Folgendes habe ich gefunden: http://kfb-Android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html
Diese einfache kleine Demo zeigt eine Lösung, indem sie ein wenig Ping-Pong zwischen einer BroadcatReceiver
und einer Service
spielt. Der Empfänger ist zum Startzeitpunkt registriert, indem er sich im Manifest registriert, um ACTION_BOOT_COMPLETED
zu empfangen. Es startet gerade einen Dienst, wenn ACTION_BOOT_COMPLETED
empfangen wird. Die Service
registriert wiederum die BroadcastReceiver
und dann das ACTION_TIME_TICK
.
Die App-Logik wird in der BroadcastReceiver
implementiert.