Pregunta

Tengo una aplicación de Android que debe despertarse esporádicamente durante todo el día.

Para hacer esto, estoy usando el AlarmManager para configurar unintent pendiendo y hacer que esto active un emisor. Este locutor de locutor comienza una actividad para llevar la interfaz de usuario en primer plano.

Todo lo anterior parece funcionar, ya que la actividad se lanza correctamente; Pero me gustaría que el Broadcastreceiver notifique a la actividad que fue iniciada por la alarma (en lugar de ser iniciado por el usuario). Para hacer esto, estoy intentando, desde el método OnReceive () del Broadcastreceiver para establecer una variable en el paquete de extras de la intención, por lo tanto:

    Intent i = new Intent(context, MyActivity.class);
    i.putExtra(wakeupKey, true);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);

En el método onresume () de mi actividad, luego busco la existencia de esta variable booleana:

protected void onResume() {
    super.onResume();

    String wakeupKey = "blah";      
    if (getIntent()!=null && getIntent().getExtras()!=null)
        Log.d("app", "onResume at " + System.currentTimeMillis() + ":" + getIntent().getExtras().getBoolean(wakeupKey));
    else
        Log.d("app", "onResume at " + System.currentTimeMillis() + ": null");
}

GetIntent ().

Si uso el mismo método para unir extras al INTENT pendiente que desencadena el locutor sin embargo, los extras salen bien.

¿Alguien puede decirme qué es diferente sobre pasar un paquete de un locutor a una actividad, en lugar de pasar el paquete de una actividad a un locutor? Me temo que puedo estar haciendo algo muy obvio mal aquí ...

¿Fue útil?

Solución

Solo para dejarlo claro (porque usé mucho tiempo descubriendo cómo hacer que funcione)

En la clase de servicio que se extiende BroadcastReceiver. Poner el siguiente código en onReceive()

Intent intent2open = new Intent(context, YourActivity.class);
intent2open.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent2open.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
String name = "KEY";
String value = "String you want to pass";
intent2open.putExtra(name, value);
context.startActivity(intent2open);

los FLAG_ACTIVITY_SINGLE_TOP Se asegura de que las aplicaciones no vuelvan a abrir si ya están abiertas. Esto significa que la intención "antigua" que abrió suactividad en primer lugar se reutiliza y no contendrá los valores adicionales. Tienes que atraparlos en otro método llamado onNewIntent() en YourActivity.

public class YourActivity extends Activity {
    private String memberFieldString;

    @Override
    public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         // Code doing your thing...
    } // End of onCreate()

    @Override
    protected void onNewIntent(Intent intent) {
    Log.d("YourActivity", "onNewIntent is called!");

    memberFieldString = intent.getStringExtra("KEY");

    super.onNewIntent(intent);
} // End of onNewIntent(Intent intent)

    @Override
    protected void onResume() {
        if (memberFieldString != null) {
            if (opstartsIntent.getStringExtra(KEY) != null) {
               Log.d("YourActivity", "memberFieldString: "+ memberFieldString);
            } else {
               Log.d("YourActivity", "The intent that started YourActivity did not have an extra string value");
            }
        }
    } // End of onResume()

}  // End of YourActivity

Tenga en cuenta las dos declaraciones if: la onResume() no sabe si se llama después OnCreate()->OnStart() OR onRestart()->onStart()
Por favor mira: http://www.anddev.org/images/android/activity_lifecycle.png

Se solo utiliza para probar si la aplicación es lanzada por el usuario (intención sin extras) o por el BroadcastReceiver (intención con extras).

Otros consejos

Este locutor de locutor comienza una actividad para llevar la interfaz de usuario en primer plano.

Este puede ser el quid de su problema aquí. Intenta anular onNewIntent() y ver si el Intent pasado tiene tu extra. Si es así, eso se debe a la forma en que configuras la actividad en el manifiesto (por ejemplo, estás usando singleTop) y el hecho de que, en este caso específico, la actividad ya existía.

También podría considerar deshacerse de i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); y vea si eso cambia importa.

El resultado es que lo que estás haciendo: poner el extra en el Intent por startActivity() - debería funcionar bien. De hecho, puedes ver ejemplos de eso aquí. Esto sugiere que es algo funky sobre la actividad (por ejemplo, singleTop) o la forma en que está invocando la actividad (por ejemplo, FLAG_ACTIVITY_NEW_TASK).

EDITAR:

Dado que mis primeras fotos no funcionaron, y dado su comentario "más curioso" arriba ...

Esto se siente un poco como un PendingIntent - Con ellos, a menos que tome medidas, no podrá actualizar extras.

Por capricho, intente agregar un segundo <intent-filter> A su actividad en el manifiesto, solo en una cadena de acción única e intente comenzar su actividad desde su receptor utilizando eso. O simplemente arroje una cadena de acción en su Intent que el receptor está usando para startActivity(), sin meterse con el manifiesto.

En vez de getIntent().getExtras().getBoolean(wakeupKey) Es más convencional escribir getIntent().getBooleanExtra(wakeupKey, defaultValue). No puedo estar seguro de si esto está relacionado con su problema, pero hay algunas cosas que ver con la creación de un paquete dentro de GetExtras () de lo que no estoy seguro, por lo que podría valer la pena ir de todos modos.

Establecer Flag Singletop funciona (no se mezcle con otras banderas)

Intent intent = new Intent(ContextManager.getContext(),OrderList.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Bundle bundle = new Bundle();       

bundle.putString("username",username);
bundle.putString("password",password);

intent.putExtras(bundle);
startActivityForResult(intent,0); 

Simplemente anule el onnewintent de esta manera y el paquete VAR estará disponible en el método Onresume:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top