studio - llamar otra actividad android
Diferenciar entre un lanzamiento de actividad desde la pantalla de inicio o desde otra actividad desde la aplicaciĆ³n (7)
Además de la respuesta de @ advantej, puede extender cada llamada de inicio a esa actividad agregando un extra al intento de inicio (por ejemplo, intent.putExtra("caller", this.getClass().getSimpleName()
);
En el método onCreate
la actividad puede verificar lo que sugiere @advantej.
Si el iniciador no es el ícono de la pantalla de inicio, puede verificar si el intent.hasExtra("caller")
devuelve verdadero, y si es así, cuál es.
Necesito conocer una forma genérica de distinguir entre una llamada de actividad desde el iniciador y una llamada de otra actividad desde dentro de mi aplicación, o una RESPUESTA en la pila de actividades
¿Nadie? Esto me está molestando desde hace bastante tiempo y necesito ponerlo en reposo ...
Gracias de antemano JQCorreia
Basado en la respuesta de advantej , aquí hay un ejemplo completo que también oculta el botón ARRIBA si la actividad se inició desde un ícono de inicio:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sell);
/**
* If this activity was started from launcher icon, then don''t show the Up button in the action bar.
*/
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
Intent intent = getIntent();
Set<String> intentCategories = intent.getCategories();
boolean wasActivityStartedFromLauncherIcon = Intent.ACTION_MAIN.equals(intent.getAction()) && intentCategories != null && intentCategories.contains(Intent.CATEGORY_LAUNCHER);
boolean showUpButton = !wasActivityStartedFromLauncherIcon;
actionBar.setDisplayHomeAsUpEnabled(showUpButton);
}
}
El enfoque más simple en el que puedo pensar sería pasar una bandera al iniciar la actividad desde sus propias actividades. También debe verificar si la actividad se creó o se reanudó, esto se puede hacer configurando un booleano en el método onCreate, y luego verificando onResume.
A continuación se muestra el código que puede utilizar ( no probado ):
Actividad en la que desea verificar (diga MainActivity.class):
Boolean onCreateCalled = false;
Boolean calledFromAppActivities = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onCreateCalled = true;
Bundle mainData = getIntent().getExtras();
if (mainData != null) {
if (getIntent().hasExtra("call_from_own_activity")) {
calledFromAppActivities = true;
}
}
.....
}
@Override
protected void onResume() {
super.onResume();
if (onCreateCalled && !calledFromAppActivities) {
// The app was not called from any of our activities.
// The activity was not resumed but was created.
// Do Stuff
}
// To stop it from running again when activity is resumed.
onCreateCalled = false;
....
}
Cuando llame a MainActivity desde otras actividades, use el siguiente código:
private void call_main () {
Intent i = new Intent(getApplicationContext(), MainActivity.class);
i.putExtra("call_from_own_activity", true);
startActivity(i);
}
En el onCreate de su actividad, llame a getIntent()
. Si la Actividad se inicia desde el iniciador (pantalla de inicio), los valores para getAction()
serán android.intent.action.MAIN
y getCategories()
devolverá un conjunto que contendrá la categoría android.intent.category.LAUNCHER. Si la actividad se inicia desde otro lugar, estos valores pueden ser null
.
Este es un método conveniente para que no tenga que escribirlo usted mismo:
protected boolean isStartedByLauncher() {
if (getIntent() == null) {
return false;
}
boolean isActionMain = Intent.ACTION_MAIN.equals(getIntent().getAction());
Set<String> categories = getIntent().getCategories();
boolean isCategoryLauncher = categories != null && categories.contains(Intent.CATEGORY_LAUNCHER);
return isActionMain && isCategoryLauncher;
}
Puedes averiguarlo desde la bandera de intención.
paso 1:
Intent intent = getIntent();
int flag = intent.getFlag();
paso 2:
if flag = Intent.FLAG_ACTIVITY_NEW_TASK
launch from other app or activities
else
launch from home page
en 2 casos el onRestart (); llamado, 1. cuando la actividad proviene del fondo, 2. cuando el usuario llega a la actividad con el botón de retroceso y luego la solución de muestra: use la función onBackPressed () para establecer una bandera ... para que sepa que el reinicio se debe a que presiona el botón de retroceso ... en onRestart () verifica la bandera y la reinicia y ...