2010-10-03 12 views
28

Estoy tratando de iniciarse automáticamente mi solicitud NightClock de carga usando el siguiente método BroadcastReceiver implementado en el onPause():startActivity() desde BroadcastReceiver

BroadcastReceiver test = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     Intent i = new Intent(context, NightClock.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    }   
}; 
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

El método OnReceive() se activa cuando el cable USB es enchufado, pero la actividad no comienza. Sin embargo, el registro muestra esto:

I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

¿Alguna idea de por qué el registro dice que la actividad se inició, pero no ocurre nada?

+0

Por favor, actualice su problema con más de LogCat - unas pocas líneas antes de ésta y una docena de líneas después de esta. Además, ¿por qué 'FLAG_ACTIVITY_NEW_TASK'? Además, ¿la actividad que registró este 'BroadcastReceiver' aún se produce cuando ocurre ACTION_POWER_CONNECTED? – CommonsWare

+0

No hay más líneas en LogCat cuando se conecta a la alimentación. El 'BroadcastReceiver' está registrado en la misma actividad que debería comenzar. Esta actividad todavía se está ejecutando en segundo plano (la aplicación LogCat se ha puesto al frente). Si esta actividad se elimina en el administrador de tareas, el 'BroadcastReceiver' no parece activarse en absoluto. ¿Este enfoque de inicio automático de mi aplicación es incorrecto desde el principio? – Gubbel

Respuesta

16

Si su objetivo es que usted desee que NightClock se inicie cada vez que se envíe una emisión de ACTION_POWER_CONNECTED, su enfoque de usar un BroadcastReceiver está bien. Sin embargo, no lo registre de una actividad. Más bien, registrarlo en el manifiesto:

<receiver android:name=".OnPowerReceiver"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     </intent-filter> 
</receiver> 

Luego, haga que su BroadcastReceiver como una clase pública de Java (aquí llamado OnPowerReceiver, aunque se le puede llamar lo que quieras), y tienen que llamar startActivity().

Tenga en cuenta que los usuarios probablemente no quieran que lo haga. Hay muchos otros casos para conectar un teléfono a la alimentación además de iniciar un "reloj nocturno". Humildemente sugiero que simplemente permita que los usuarios comiencen su actividad a través de la pantalla de inicio.

+0

He registrado el 'BroadcastReceiver' en el manifiesto como dijiste con esta llamada en el método' onReceive() ':' context.startActivity (new Intent (context, NightClock.class)) 'Pero nada sucede cuando me conecto el teléfono al poder Ni siquiera se agrega una entrada de registro si agrego 'Log.d (this.toString()," tratando de iniciar la aplicación ... ");' al método. – Gubbel

+2

@Gubbel: Ups. Pruebe ''. La mayoría de las veces, no tienen el 'ACTION_' en la cadena, pero aparentemente lo hacen en este. – CommonsWare

+0

¡Funciona! Gracias. – Gubbel

46

Tienes contexto pasado como parámetro al método onRecieve(), por lo que sólo tiene que utilizar:

@Override 
public void onReceive(Context context, Intent intent) { 
    //start activity 
    Intent i = new Intent(); 
    i.setClassName("com.test", "com.test.MainActivity"); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

que funciona, por supuesto, usted tiene que cambiar el nombre del paquete y la clase de actividad a la suya.

+2

¿Por qué el voto a favor? ¿Es esto malo? Me ayudó a +1 porque no pude encontrar nada que dijera que era un mal enfoque. – Mafro34

+0

@ Mafro34 Acabo de probar el mismo enfoque y la razón por la que creo que no es ideal es la bandera que está configurando. Porque a menos que esto sea lo que quieres (ejecutar una nueva tarea) podría ensuciar seriamente la lógica de tu aplicación, de todos modos lo hizo con la mía. Entonces, a menos que esto sea lo que quieres, recomiendo encontrar otro enfoque. – AgentKnopf

+5

@AgentKnopf Parece que no tiene muchas opciones: (desde http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent,%20android.os.Bundle % 29): "Tenga en cuenta que si se llama a este método desde fuera de un contexto de actividad, entonces la intención debe incluir el indicador de inicio FLAG_ACTIVITY_NEW_TASK. Esto se debe a que, sin iniciarse desde una actividad existente, no hay ninguna tarea existente en la que para colocar la nueva actividad y, por lo tanto, debe colocarse en su propia tarea por separado ". – aberaud

-3

De Docs:

No inicie actividades de los receptores de radiodifusión debido a que la experiencia del usuario es discordante; especialmente si hay más de un receptor. En cambio, considera mostrar una notificación.

+0

Anulan esto en muchas aplicaciones predeterminadas, como alarmas y llamadas entrantes. Entonces, si el usuario quiere que esto suceda, es su decisión. Y tu respuesta no responde la pregunta. – Dpedrinha

Cuestiones relacionadas