2009-06-13 13 views
46

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

+1

Non l'ho provato da solo, ma sarebbe possibile avviare un servizio dall'oggetto Application? – phreed

+0

Penso che funzioni http://android-codes-examples.blogspot.com/2011/11/running-service-in-background-on.html – Android

risposta

43

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.

+7

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 –

+2

ACTION_USER_PRESENT è un suggerimento fantastico. Ho lottato per mantenere il mio servizio vivo per anni, e questo ha appena risolto. – defrex

+0

Bene, questo non sembra funzionare su Android 4.0.x più ... – ubuntudroid

14

ritorno START_STICKY in Service.onStartCommand

Android sarà riavviare il servizio

+2

START_STICKY è valido solo per Android 2.0+ – cow

+0

ma il servizio deve essere eseguito almeno una volta per ottenere la continuità corretta? –

0

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.

Problemi correlati