154

Estoy usando un AlarmManager para activar un intento que transmite una señal. Lo que sigue es mi código:¿Llamar a startActivity() desde fuera de una actividad?

AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
Intent i = new Intent(this, Wakeup.class); 
try 
{ 
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); 
    Long elapsed += // sleep time; 
    mgr.set(AlarmManager.RTC_WAKEUP, elapsed, pi); 
} 
catch(Exception r) 
{ 
    Log.v(TAG, "RunTimeException: " + r); 
} 

Voy a llamar a este código de un Activity, así que no sé cómo podría estar recibiendo el siguiente error ...

ERROR/AndroidRuntime(7557): java.lang.RuntimeException: Unable to start receiver com.wcc.Wakeup: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 

Respuesta

426

¿Qué pasaría si añadir esta línea:

... 
Intent i = new Intent(this, Wakeup.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
... 
+8

sí esto funciona. pero si desea iniciar varias instancias de la misma actividad, esto no funciona. Dado que FLAG_ACTIVITY_NEW_TASK reanudará la misma Actividad existente –

+44

Esta es la respuesta a la pregunta. Si el remitente desea hacer una pregunta de diferencia, deberían hacerlo. Sin embargo, esta respuesta definitivamente debe aceptarse :) – DashRantic

+5

Agregar indicador FLAG_ACTIVITY_Multiple_TASKS PARA RESOLVER SU problema –

51

por ejemplo múltiple de la misma actividad, utilizar el siguiente fragmento,

Nota: Este fragmento, estoy usando fuera de mi Activity. Asegúrese de que su archivo AndroidManifest no contenga android:launchMode="singleTop|singleInstance". si es necesario, puede cambiarlo a android:launchMode="standard".

Intent i = new Intent().setClass(mActivity.getApplication(), TestUserProfileScreenActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 

// Launch the new activity and add the additional flags to the intent 
mActivity.getApplication().startActivity(i); 

Esto funciona bien para mí. Espero, esto ahorra tiempos para alguien. Si alguien encuentra una mejor manera, por favor, comparta con nosotros.

+5

Por favor, comprenda la diferencia entre los métodos setFlags() y addFlag(). Todo lo que estás haciendo ahora es iniciar una actividad con FLAG_ACTIVITY_NEW_TASK. Como en el código publicado por Cristian a continuación. – JehandadK

+0

------------------------------------------------- ------------------ i.addFlag (Intent.FLAG_ACTIVITY_MULTIPLE_TASK); i.addFlag (Intent.FLAG_ACTIVITY_NEW_TASK); ------------------------------------------------- ------------------ i.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); – JehandadK

11

No pegó la parte donde llama al startActivity, esa es la parte interesante.

Puede llamar al startActivity en un contexto Service, o en un contexto Application.

Imprima "this" para registrar cat antes de realizar la llamada startActivity, y vea a qué se refiere, a veces es un caso de usar un "esto" interno accidentalmente.

+1

Este es probablemente el problema que está teniendo OP. He encontrado lo mismo. Lanzar una actividad con getApplicationContext() en lugar de una actividad existente activará este error. –

+0

NICE :) Estoy bastante seguro de que este fue el error que trato de detectar toda la noche. Gracias Señor. –

1

trate de cambiar a esta línea:

PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 0, i, 0); 
0

Cuando se desea abrir una actividad dentro de su aplicación a continuación, puede llamar al método startActivity() con la intención como parámetro. Esa intención sería la actividad que desea abrir. Primero tiene que crear un objeto de esa intención con el primer parámetro para ser el contexto y el segundo parámetro para ser la clase de actividad específica.

Intent intent = new Intent(this, Activity_a.class); 
startActivity(intent); 

Espero que esto ayude.

+3

Escribo como usuario porque su respuesta ha sido marcada como de mala calidad. El inconveniente de esta respuesta es que no hay explicación de lo que hace su código o de por qué resuelve el problema planteado en la pregunta. ¿Podría agregar algunos comentarios explicativos, teniendo en cuenta que muchos programadores podrían leer su respuesta en el futuro como guía? ¡Gracias! –

+0

Cuando desea abrir una actividad dentro de su aplicación, puede llamar al método startActivity() con un parámetro Intent. Esa intención sería la actividad que desea abrir. Primero tiene que crear un objeto de esa intención con el primer parámetro para ser el contexto y el segundo parámetro para ser la clase de actividad específica. Espero que esto ayude. –

+0

OK. Pero en lugar de poner esa información en un comentario, debe editar su respuesta y colocarla allí. Lamento haber insistido en este punto, pero es importante hacer esto para cada respuesta. Atentamente. –

3

A veces este error puede ocurrir sin una llamada explícita a startActivity(...). Por ejemplo, algunos de ustedes pueden haber visto un seguimiento de pila de este tipo en Crashlytics:

Fatal Exception: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
     at android.app.ContextImpl.startActivity(ContextImpl.java:1597) 
     at android.app.ContextImpl.startActivity(ContextImpl.java:1584) 
     at android.content.ContextWrapper.startActivity(ContextWrapper.java:337) 
     at android.text.style.URLSpan.onClick(URLSpan.java:62) 
     at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:217) 
     at android.widget.TextView.onTouchEvent(TextView.java:9522) 
     at android.view.View.dispatchTouchEvent(View.java:8968) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.widget.AbsListView.dispatchTouchEvent(AbsListView.java:5303) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2559) 
     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1767) 
     at android.app.Activity.dispatchTouchEvent(Activity.java:2866) 
     at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67) 
     at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2520) 
     at android.view.View.dispatchPointerEvent(View.java:9173) 
     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4706) 
     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4544) 
     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068) 
     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4121) 
     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4087) 
     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4201) 
     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4095) 
     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4258) 
     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068) 
     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4121) 
     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4087) 
     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4095) 
     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4068) 
     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6564) 
     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6454) 
     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6425) 
     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6654) 
     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 
     at android.os.MessageQueue.nativePollOnce(MessageQueue.java) 
     at android.os.MessageQueue.next(MessageQueue.java:143) 
     at android.os.Looper.loop(Looper.java:130) 
     at android.app.ActivityThread.main(ActivityThread.java:5942) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 

Y usted puede preguntarse lo que hizo mal, ya que la traza sólo incluye código de la arquitectura. Bueno, aquí hay un ejemplo de cómo puede suceder esto. Digamos que estamos en un fragmento.

Activity activity = getActivity(); 
Context activityContext = activity; 
Context appContext = activityContext.getApplicationContext(); 
LayoutInflater inflater = LayoutInflater.from(appContext); // whoops! 
View view = inflater.inflate(R.layout.some_layout, parent, false); 
TextView tvWithLinks = (TextView) view.findViewById(R.id.tv_with_links); 

tvWithLinks.setMovementMethod(LinkMovementMethod.getInstance()); // whoops!! 

Ahora, cuando un usuario hace clic en ese punto de vista de texto, su aplicación va a chocar con el seguimiento de la pila anterior. Esto se debe a que layout inflater tiene una referencia al contexto de aplicación , por lo que su vista de texto tiene un contexto de aplicación. Al hacer clic en esa vista de texto implícitamente llama al appContext.startActivity(...).

Nota final: Probé esto en dispositivos Android 4, 5, 6 y 7. Solo afecta a 4, 5 y 6. Aparentemente, los dispositivos Android 7 no tienen problemas para llamar al appContext.startActivity(...).

¡Espero que esto ayude a otra persona!

Cuestiones relacionadas