studio programacion herramientas fundamentos con avanzado aplicaciones android autostart bootcompleted

programacion - manual de android en pdf



Android: servicio de inicio en el momento del arranque (7)

Necesito comenzar un servicio en el momento del arranque. Busqué mucho. Están hablando de Broadcastreceiver. Como soy nuevo en el desarrollo de Android, no obtuve una idea clara de los servicios en Android. Proporcione algún código fuente.


Es posible registrar su propio servicio de aplicación para que se inicie automáticamente cuando el dispositivo se haya iniciado. Lo necesita, por ejemplo, cuando desea recibir eventos push desde un servidor http y desea informar al usuario tan pronto como ocurra un nuevo evento. El usuario no tiene que iniciar la actividad manualmente antes de comenzar el servicio ...

Es bastante simple. Primero, otorgue a su aplicación el permiso RECEIVE_BOOT_COMPLETED. A continuación, debe registrar un BroadcastReveiver. Lo llamamos BootCompletedIntentReceiver.

Su Manifest.xml ahora debería verse así:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jjoe64"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application> <receiver android:name=".BootCompletedIntentReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:name=".BackgroundService"/> </application> </manifest>

Como último paso, debe implementar el Receptor. Este receptor solo comienza su servicio en segundo plano.

package com.jjoe64; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.jjoe64.BackgroundService; public class BootCompletedIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { Intent pushIntent = new Intent(context, BackgroundService.class); context.startService(pushIntent); } } }

Desde http://www.jjoe64.com/2011/06/autostart-service-on-device-boot.html


A la mayoría de las soluciones publicadas aquí les falta una pieza importante: hacerlo sin un bloqueo de activación corre el riesgo de que su Servicio muera antes de que se termine de procesar. Vi esta solución en otro hilo, respondiendo aquí también.

Primero debe obtener un bloqueo 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 bloqueo 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 olvide agregar el permiso WAKE_LOCK y registrar su receptor en el manifiesto:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> ... <service android:name=".SimpleWakefulReceiver"> <intent-filter> <action android:name="com.example.SimpleWakefulReceiver"/> </intent-filter> </service>



Primero registre un receptor en su archivo manifest.xml:

<receiver android:name="com.mileagelog.service.Broadcast_PowerUp" > <intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> </intent-filter> </receiver>

y luego escribe una transmisión para este receptor como:

public class Broadcast_PowerUp extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_POWER_CONNECTED)) { Toast.makeText(context, "Service_PowerUp Started", Toast.LENGTH_LONG).show(); } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) { Toast.makeText(context, "Service_PowerUp Stoped", Toast.LENGTH_LONG) .show(); } } }


Su receptor:

public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, YourService.class); context.startService(myIntent); } }

Su AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.broadcast.receiver.example" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name=".BR_Example" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- Declaring broadcast receiver for BOOT_COMPLETED event. --> <receiver android:name=".MyReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> </application> <!-- Adding the permission --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> </manifest>


También registre su servicio creado en el Manifiesto y use permiso como

<application ...> <service android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.MyBroadcastReciver"/> </intent-filter> </service> </application> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

y luego en Braod cast Reciever llama a tu servicio

public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, MyService.class); context.startService(myIntent); } }


debes registrarte para BOOT_COMPLETE y REBOOT

<receiver android:name=".Services.BootComplete"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.REBOOT"/> </intent-filter> </receiver>