versiones pie oreo developer descargar android
Aquí está el proyecto que he creado

oreo - android pie



Comportamiento desconcertante con REORDER_TO_FRONT (6)

La actividad A comienza la actividad B sin banderas. La pila ahora es AB con B en la parte superior. B inicia la actividad A con FLAG_ACTIVITY_REORDER_TO_FRONT (el único indicador). Yo esperaría que la pila ahora sea BA. Sin embargo, cuando se presiona el botón Atrás en este punto, vuelve a la pantalla de inicio. Aquí esperaría que la Actividad B fuera llevada al frente. Al hacer clic nuevamente en el ícono del iniciador, la aplicación se abre con B como actividad de ejecución y nada en la pila.

Launchmode es estándar (predeterminado) en el manifiesto.

¿Es este el comportamiento esperado y no lo entiendo bien?

EDITAR: He creado un proyecto de prueba sin factores de confusión y todavía veo el mismo comportamiento. Simplemente no lo entiendo, no parece estar de acuerdo con la documentación.

EDITAR: Para mí, este comportamiento parece ser un ERROR en el marco, vea mi comentario sobre la respuesta a continuación. Necesito una solución.

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, SecondActivity.class); startActivity(flowIntent); } public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, SecondActivity.class); startActivity(flowIntent); } } public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, MainActivity.class); flowIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(flowIntent); } }

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, SecondActivity.class); startActivity(flowIntent); } } public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, MainActivity.class); flowIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(flowIntent); } }

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, SecondActivity.class); startActivity(flowIntent); } } public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, MainActivity.class); flowIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(flowIntent); } }

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, SecondActivity.class); startActivity(flowIntent); } } public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, MainActivity.class); flowIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(flowIntent); } }

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, SecondActivity.class); startActivity(flowIntent); } } public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, MainActivity.class); flowIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(flowIntent); } }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, MainActivity.class); flowIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(flowIntent); } public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, SecondActivity.class); startActivity(flowIntent); } } public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, MainActivity.class); flowIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(flowIntent); } }

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, SecondActivity.class); startActivity(flowIntent); } } public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickBtn(View view) { Intent flowIntent = new Intent(this, MainActivity.class); flowIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(flowIntent); } }

Manifiesto:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android&quot; package="com.example.tester" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.tester.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.tester.SecondActivity" /> </application> </manifest>


En primer lugar, ¡comencemos diciendo que tienes razón !

Pero si mi lógica es correcta, ¿qué sucede cuando REORDER a su Activity principal (la Activity del Launcher ), el Intento se establece de modo que la pulsación posterior lo devuelva al Launcher ?

Como experimento, intente agregar la Activity C e intente REORDER B al frente desde C. Eso es:
A-> B-> C ... A-> C-> B

Si el orden es muy importante para usted, es posible que deba reemplazar el método Activity.onNewIntent() .

@Override protected void onNewIntent(Intent intent) { }


Encuentro una solución simple para este error.

Anule enNewIntent y finalice las funciones de cualquier actividad que se pueda reordenar al frente, ya que lo siguiente será un truco, pero no tan completo de prueba. Si encuentra algún problema para esta solución, comuníquese conmigo por [email protected]

@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if ((intent.getFlags() | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) > 0) { mIsRestoredToTop = true; } } @Override public void finish() { super.finish(); if (android.os.Build.VERSION.SDK_INT >= 19 && !isTaskRoot() && mIsRestoredToTop) { // 4.4.2 platform issues for FLAG_ACTIVITY_REORDER_TO_FRONT, // reordered activity back press will go to home unexpectly, // Workaround: move reordered activity current task to front when it''s finished. ActivityManager tasksManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); tasksManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION); } }


Estoy viendo que este problema está ocurriendo en S7 7.0 OS donde la actividad se configura con Flag Intent.FLAG_ACTIVITY_REORDER_TO_FRONT y esta actividad finaliza, el usuario pasa a la pantalla de inicio del dispositivo.

La corrección que puse para esto es: eliminé el indicador Intent.FLAG_ACTIVITY_REORDER_TO_FRONT y añadí noHistory = true

De esta manera, la nueva instancia de actividad se empuja a la pila y, dado que noHistory es cierto, la instancia antigua que ya forma parte de las pilas se destruye.



También me encontré con este error y decidí que podría necesitar solucionarlo. Y al menos en mi caso, parece ser posible al proporcionar una implementación personalizada de la contraportada para la versión 4.4.2. Esto de ninguna manera es bonito, y puede que no funcione en todas las situaciones, pero me salvó a mí y a mi navegación basada en DrawerLayout .

Primero, tengo una NavigationDrawerActivity como una clase que extienden todas las demás actividades. Allí tengo una Stack estática para las clases que se llaman, así como una serie de clases a las que se puede acceder desde el cajón de navegación. El método addClassToStack es público, por lo que otros medios de navegación, además del cajón, también pueden usar la pila. Observe cómo la clase que se agrega a la pila se elimina primero (si existe) para que obtengamos la misma funcionalidad que normalmente proporciona la bandera de reordenar al frente. He rodeado el código hacky con verificaciones de versión para que el hack solo se use cuando sea necesario.

public class NavigationDrawerActivity extends Activity { ... private static Stack<Class<?>> classes = new Stack<Class<?>>(); private Class<?>[] activity_classes; ... public static void addClassToStack(Class<?> to_add) { if (android.os.Build.VERSION.RELEASE.equals("4.4.2")) { classes.remove(to_add); classes.push(to_add); } } ...

El siguiente es la clase de oyente para el cajón de navegación. Los botones de mi cajón están en un ListView por lo que cada vez que el usuario quiera ir a algún lugar, se onItemClick aquí. La única cosa "pirateada" aquí es la llamada a addClassToStack para agregar la nueva actividad como la parte superior de la pila trasera.

private class DrawerItemClickListener implements ListView.OnItemClickListener { private Intent i; @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { i = new Intent(NavDrawerActivity.this, activity_classes[pos]); addClassToStack(activity_classes[pos]); i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); nav_drawer.closeDrawers(); startActivity(i); } }

La última parte de la solución es anular el método onKeyDown y, en caso de que se presione el botón de retroceso en Android 4.4.2 (y estamos más allá de la primera actividad en nuestra navegación), la actividad que se abrirá se obtiene de nuestra contraportada personalizada y llama directamente. Tenga en cuenta que el elemento superior de la pila es siempre la actividad actual y, por lo tanto, debemos deshacernos de eso y utilizar el segundo como objetivo. También tenga en cuenta cómo estoy borrando el historial de tareas cuando vuelvo a la primera actividad. Esto fue necesario porque de lo contrario, después de presionar atrás una vez más y volver a la pantalla de inicio, la próxima vez que se accediera a la aplicación, iría directamente a la parte superior de la pila oficial.

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { boolean handled = false; if (keyCode == KeyEvent.KEYCODE_BACK && android.os.Build.VERSION.RELEASE.equals("4.4.2") && classes.size() > 1) { classes.pop(); Intent prev = new Intent(this, classes.peek()); if (classes.size() == 1) { prev.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); } else { prev.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); } startActivity(prev); handled = true; } if (!handled) { return super.onKeyDown(keyCode, event); } else { return true; } } }

Lo único que queda (y no se muestra aquí) es agregar la actividad inicial (la que se abre cuando se inicia la aplicación) en la pila trasera por separado en un lugar apropiado. En mi aplicación, tengo una pantalla de inicio separada que no es accesible a través del cajón de navegación, por lo que puedo llamar a NavigationDrawerActivity.addClassToStack(StartScreenActivity.class) desde el NavigationDrawerActivity.addClassToStack(StartScreenActivity.class) de esa actividad. Para otras estructuras, puede hacer algo diferente para asegurarse de que la actividad inicial se agregue a la pila solo una vez como el primer elemento.

Ahora, este es un truco y no lo he probado muy a fondo todavía, pero parece funcionar también en el Nexus 4 (4.4.2) y en un Nexus S (pegado en 4.1) también. Entonces, si intentas hacer algo como esto y no funciona, no te enojes, pero házmelo saber. :)