Android: inicia el servicio al arrancar

De todo lo que he visto en Stack Exchange y en otros lugares, tengo todo configurado correctamente para iniciar un IntentService cuando se inicia el sistema operativo Android. Lamentablemente, no se inicia al arrancar y no recibo ningún error. Tal vez los expertos pueden ayudar …

Manifiesto:

               

BroadcastReceiver para el inicio:

 package com.phx.batterylogger; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class StartupIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(context, BatteryLogger.class); context.startService(serviceIntent); } } 

ACTUALIZACIÓN : Intenté casi todas las sugerencias a continuación y agregué el registro como Log.v("BatteryLogger", "Got to onReceive, about to start service"); al controlador onReceive de StartupIntentReceiver, y nunca se registra nada. Entonces ni siquiera está llegando al BroadcastReceiver.

Creo que estoy implementando el APK y probando correctamente, solo ejecutando Debug en Eclipse y la consola dice que lo instala exitosamente en mi tableta Xoom en \ BatteryLogger \ bin \ BatteryLogger.apk. Luego, para probar, reinicio la tableta y luego miro los registros en DDMS y verifico los Servicios en ejecución en la configuración del sistema operativo. ¿Todo esto suena correcto o me falta algo? De nuevo, cualquier ayuda es muy apreciada.

Bueno, aquí hay un ejemplo completo de una aplicación AutoStart

Archivo AndroidManifest

              

autostart.java

 public class autostart extends BroadcastReceiver { public void onReceive(Context context, Intent arg1) { Intent intent = new Intent(context,service.class); context.startService(intent); Log.i("Autostart", "started"); } } 

service.java

 public class service extends Service { private static final String TAG = "MyService"; @Override public IBinder onBind(Intent intent) { return null; } public void onDestroy() { Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); Log.d(TAG, "onDestroy"); } @Override public void onStart(Intent intent, int startid) { Intent intents = new Intent(getBaseContext(),hello.class); intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intents); Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); Log.d(TAG, "onStart"); } } 

hello.java : se abrirá cada vez que inicie el dispositivo después de ejecutar el Applicaton una vez.

 public class hello extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Toast.makeText(getBaseContext(), "Hello........", Toast.LENGTH_LONG).show(); } } 

Lo siguiente debería funcionar. Lo he verificado Puede ser tu problema en otro lugar.

 public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.d("TAG", "MyReceiver"); Intent serviceIntent = new Intent(context, Test1Service.class); context.startService(serviceIntent); } } public class Test1Service extends Service { /** Called when the activity is first created. */ @Override public void onCreate() { super.onCreate(); Log.d("TAG", "Service created."); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("TAG", "Service started."); return super.onStartCommand(intent, flags, startId); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.d("TAG", "Service started."); } @Override public IBinder onBind(Intent arg0) { return null; } }                  

Es posible que su servicio se cierre antes de que se complete debido a que el dispositivo se quedará dormido después del arranque. Primero debe obtener un locking por activación. Afortunadamente, la biblioteca de soporte nos da una clase para hacer esto:

 public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // This is the Intent to deliver to our service. Intent service = new Intent(context, SimpleWakefulService.class); // Start the service, keeping the device awake while it is launching. Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); startWakefulService(context, service); } } 

luego, en su Servicio, asegúrese de liberar el locking de activación:

  @Override protected void onHandleIntent(Intent intent) { // At this point SimpleWakefulReceiver is still holding a wake lock // for us. We can do whatever we need to here and then tell it that // it can release the wakelock. ... Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime()); SimpleWakefulReceiver.completeWakefulIntent(intent); } 

No olvides agregar el permiso WAKE_LOCK:

   

Se ve muy similar al mío, pero utilizo el nombre completo del paquete para el receptor:

  

Yo tengo:

  

He tenido éxito sin el paquete completo, ¿sabes dónde se interrumpe la cadena de llamadas? Si depura con Log() , ¿en qué punto ya no funciona?

Creo que puede ser en su IntentService, todo esto se ve bien.

Solo para facilitar la búsqueda, como se menciona en los comentarios, esto no es posible desde 3.1 https://stackoverflow.com/a/19856367/6505257