studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java android broadcastreceiver intentservice

java - para - manual de programacion android pdf



Android: inicia el servicio al arrancar (5)

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:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.phx.batterylogger" android:versionCode="1" android:versionName="1.0" android:installLocation="internalOnly"> <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BATTERY_STATS" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <service android:name=".BatteryLogger"/> <receiver android:name=".StartupIntentReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest>

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

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pack.saltriver" android:versionCode="1" android:versionName="1.0" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <receiver android:name=".autostart"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <activity android:name=".hello"></activity> <service android:enabled="true" android:name=".service" /> </application> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> </manifest>

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(); } }


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 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 olvides agregar el permiso WAKE_LOCK:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" />


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.


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; } } <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test" android:versionCode="1" android:versionName="1.0" android:installLocation="internalOnly"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BATTERY_STATS" /> <!-- <activity android:name=".MyActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity> --> <service android:name=".Test1Service" android:label="@string/app_name" > </service> <receiver android:name=".MyReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest>


Se ve muy similar al mine pero utilizo el nombre completo del paquete para el receptor:

<receiver android:name=".StartupIntentReceiver">

Yo tengo:

<receiver android:name="com.your.package.AutoStart">