Sto creando un'applicazione il cui unico componente è uno service
che continua a essere eseguito in background (fondamentalmente un server proxy) ma non sono in grado di trovare un modo per avviare quel servizio. L'applicazione non può avere un'interfaccia utente o l'interazione dell'utente, quindi non sto utilizzando Activity.
Broadcast receiver
è in grado di ascoltare la trasmissione BOOT, ma come si avvia la prima volta il servizio quando è installato e come posso mantenerlo in esecuzione? o c'è una trasmissione che posso ascoltare dopo l'installazione di app, ad es. potrebbe essere TIME_TICK ma deve essere registrato dall'attività che penso.Come avviare l'app Android solo per il servizio
risposta
Purtroppo al momento non esiste un modo affidabile per ricevere un evento di trasmissione dopo aver installato l'applicazione, l'intento ACTION_PACKAGE_ADDED non viene trasmesso al pacchetto appena installato.
Per ricevere l'evento ACTION_BOOT_COMPLETED, è necessario disporre di una classe ricevente broadcast e del servizio. Vorrei anche raccomandare di aggiungere l'intento dello ACTION_USER_PRESENT al ricevitore broadcast, che richiede Android 1.5 (minSDK = 3), che chiamerà il ricevitore broadcast ogni volta che l'utente sblocca il telefono. L'ultima cosa che puoi fare per provare a mantenere il tuo servizio in esecuzione senza che sia facilmente spento automaticamente è chiamare il servizio 01Cnel servizio onCreate per dire a Android che il tuo servizio non dovrebbe essere fermato, questo è stato aggiunto principalmente per il lettore mp3 servizi che devono continuare a funzionare ma possono essere utilizzati da qualsiasi servizio.
Assicurarsi di aggiungere le autorizzazioni appropriate per gli eventi boot_complete e user_present nel manifest.
Ecco una classe semplice che è possibile utilizzare come ricevitore di trasmissione per gli eventi.
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));
}
}
}
};
Buona fortuna.
Buon consiglio. Una cosa su Service.setForeground(): non funziona più su Android 2.0+. Ora tutti i servizi "longevi" devono avere una notifica persistente nell'area di notifica mentre sono in esecuzione. Esempio qui: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.html –
ACTION_USER_PRESENT è un suggerimento fantastico. Ho lottato per mantenere il mio servizio vivo per anni, e questo ha appena risolto. – defrex
Bene, questo non sembra funzionare su Android 4.0.x più ... – ubuntudroid
ritorno START_STICKY
in Service.onStartCommand
Android sarà riavviare il servizio
START_STICKY è valido solo per Android 2.0+ – cow
ma il servizio deve essere eseguito almeno una volta per ottenere la continuità corretta? –
Sono alla ricerca sullo stesso argomento. Ecco è quello che ho trovato: http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html
Questo piccolo e semplice demo mostra una soluzione per la riproduzione di un po 'di ping-pong tra un BroadcatReceiver
e Service
. Il ricevitore è registrato per iniziare al momento dell'avvio registrandosi nel manifesto per ricevere ACTION_BOOT_COMPLETED
. Avvia appena un servizio durante la ricezione di ACTION_BOOT_COMPLETED
. Lo Service
registra a sua volta lo BroadcastReceiver
quindi per lo ACTION_TIME_TICK
.
La logica dell'app verrà implementata nello BroadcastReceiver
.
Non l'ho provato da solo, ma sarebbe possibile avviare un servizio dall'oggetto Application? – phreed
Penso che funzioni http://android-codes-examples.blogspot.com/2011/11/running-service-in-background-on.html – Android