what how current context application and activity android android-activity android-context

android - how - Llamar a startActivity() desde fuera de un contexto de actividad



how to get context android (21)

Además: si muestra enlaces en la vista de lista en el fragmento , no lo cree así

adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings);

en lugar de llamar

adapter = new ListAdapter(getActivity(),mStrings);

el adaptador funciona bien en ambos casos, pero los enlaces solo funcionan en el último.

He implementado un ListView en mi aplicación de Android. Me vinculo a este ListView utilizando una subclase personalizada de la clase ArrayAdapter . Dentro del método ArrayAdapter.getView(...) anulado, asigno un OnClickListener . En el método onClick de OnClickListener , quiero iniciar una nueva actividad. Tengo la excepción:

Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

¿Cómo puedo obtener el Context que está trabajando ListView (la Activity actual)?


Creo que tal vez esté implementando OnClickListener en el lugar equivocado; por lo general, definitivamente debería implementar un OnItemClickListener en su Actividad y configurarlo en el ListView, o tendrá problemas con sus eventos ...


Dado que agregar indicadores afecta a event_flow y stack_history, es mejor pasar el ''contexto de la aplicación'' a la no actividad desde donde debe llamar a una clase de actividad de la siguiente manera:

"ActivityClassName.this" (Aunque pase el contexto de esta manera, contendrá todos los detalles y la información que necesita para llamar a una Actividad desde un escenario sin actividad)

Por lo tanto, no es necesario establecer o agregar indicadores, esto funcionará bien en todos los casos.


Elaborando un poco más la respuesta de Alex Volovoy.

En caso de que tengas este problema con los fragmentos, getActivity () funciona bien para obtener el contexto.

En otros casos:

Si no quieres usar-

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend

luego haga una función como esta en su OutsideClass -

public void gettingContext(Context context){ real_context = context;//where real_context is a global variable of type Context }

Ahora, en su actividad principal cada vez que realice una nueva llamada a OutsideClass, utilice el método anterior inmediatamente después de definir OutsideClass, dando el contexto de la actividad como argumento. También en tu actividad principal haz una función.

public void startNewActivity(final String activity_to_start) { if(activity_to_start.equals("ACTIVITY_KEY")); //ACTIVITY_KEY-is a custom key,just to //differentiate different activities Intent i = new Intent(MainActivity.this, ActivityToStartName.class); activity_context.startActivity(i); }//you can make a if-else ladder or use switch-case

Ahora vuelva a su clase externa, y para comenzar una nueva actividad, haga algo como esto:

@Override public void onClick(View v) { ........ case R.id.any_button: MainActivity mainAct = (MainActivity) real_context; mainAct.startNewActivity("ACTIVITY_KEY"); break; } ........ }

De esta manera, podrás iniciar diferentes actividades llamadas desde diferentes OutsideClass sin arruinar las banderas.

Nota: intente no almacenar en caché el objeto de contexto a través del constructor para el fragmento (con el adaptador, está bien). Un fragmento debe tener un constructor vacío; de lo contrario, la aplicación se bloquea en algunos escenarios.

recuerda llamar

OutsideClass.gettingContext(Context context);

en la función onResume () también.


En lugar de usar (getApplicationContext) use YourActivity.this


En mi opinión, es mejor utilizar el método de startActivity() solo en el código de su Activity.class . Si usa eso en el Adapter u otra clase, resultará en eso.


Enfrentó el mismo problema luego se implementó.
intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
Y consiguió resolver el problema.

Puede haber otro motivo relacionado con el adaptador de vista de lista.
Puedes ver este blog , lo describí muy bien.


Este error se produce cuando startactivity no sabe cuál es su actividad. Por lo que debe agregar actividad antes de startActivity ()

debes establecer

activity.startActivity(yourIntent);


Mi situación fue un poco diferente, estoy probando mi aplicación utilizando Espresso y tuve que iniciar mi Activity with ActivityTestRule desde el Context instrumentación (que no proviene de una Activity ).

fun intent(context: Context) = Intent(context, HomeActivity::class.java) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

Tuve que cambiar las banderas y agregar una or bitwise ( | en Java) con Intent.FLAG_ACTIVITY_NEW_TASK

Así resulta en:

fun intent(context: Context) = Intent(context, HomeActivity::class.java) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)


Para cualquier persona que obtenga esto en Xamarin.Android (MonoDroid), incluso cuando se llama a StartActivity desde la actividad: este es realmente un error de Xamarin con el nuevo tiempo de ejecución de ART, consulte https://bugzilla.xamarin.com/show_bug.cgi?id=17630


Puedes lograrlo con addFlags lugar de setFlags

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Según la addFlags que hace:

Agregue indicadores adicionales a la intención (o con el valor de los indicadores existentes).

EDITAR

Tenga en cuenta que si está utilizando indicadores que cambia la pila de historial como dice la respuesta de Alex Volovoy :

... evite establecer marcas ya que interferirá con el flujo normal de eventos y la pila de historial.


Si está invocando el complemento share Intent in Cordova, configurar la bandera no ayudará. En su lugar usa esto

cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "title"));


Si tienes un error debido al uso de crear selector como a continuación:

Intent sharingIntent = new Intent(Intent.ACTION_VIEW); sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sharingIntent.setData(Uri.parse("http://google.com")); startActivity(Intent.createChooser(sharingIntent, "Open With"));

Establezca la bandera para crear un selector como este:

Intent sharingIntent = new Intent(Intent.ACTION_VIEW); sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sharingIntent.setData(Uri.parse("http://google.com")); Intent chooserIntent = Intent.createChooser(sharingIntent, "Open With"); chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(chooserIntent);


También tuve el mismo problema. Compruebe todo el contexto que ha pasado. Para los '' enlaces '' necesita contexto de actividad, no contexto de aplicación .

Este es el lugar donde debes revisar:

1.) Si usó LayoutInflater , verifique qué contexto ha pasado.

2.) Si está utilizando algún adaptador, verifique qué contexto ha pasado.


Vea, si está creando una intención dentro de un listiner en algún método

override onClick (View v).

luego llama al contexto a través de esta vista también:

v.getContext ()

Ni siquiera necesitará SetFlags ...


Ya sea

  • caché el objeto de contexto a través del constructor en su adaptador, o
  • Consíguelo desde tu punto de vista.

O como último recurso,

  • añada la bandera FLAG_ACTIVITY_NEW_TASK a su intención:

_

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Editar: evitaría establecer indicadores, ya que interferirá con el flujo normal de eventos y la pila de historial.


Yo tuve el mismo problema. El problema es con el contexto. Si desea abrir algún enlace (por ejemplo, compartir cualquier enlace a través del selector) pase el contexto de la actividad, no el contexto de la aplicación.

No olvide agregar myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) si no está en su actividad.


usa este código funciona bien para mi Compartir algo desde fuera de una actividad

Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); // Append Text String Text = "Your Text Here" intent.putExtra(Intent.EXTRA_TEXT, Text); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent shareIntent = Intent.createChooser(intent,"Share . . . "); shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); G.context.getApplicationContext().startActivity(shareIntent);


CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);

o

Context mContext = getAppliactionContext(); CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

cambiar a continuación

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);


Intent i= new Intent(context, NextActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);


Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(viewIntent);

Espero que esto funcione.