android android-activity android-intent

Android lanza la configuración del sistema en lugar de mi aplicación



api 28 android (4)

Por alguna razón, cada vez que (intento) iniciar mi aplicación, el teléfono decide iniciar la configuración del sistema en lugar de mi "actividad principal". Y sí, me refiero a la "configuración del sistema Android", y no a algo de mi aplicación.

Esto solo ocurre en mi teléfono, y supongo que probablemente esté relacionado con el hecho de que mi aplicación acababa de abrir la configuración del sistema cuando decidí volver a iniciar con una nueva versión de Eclipse.

Es posible iniciar la aplicación desde Eclipse, pero cuando vuelvo desde la aplicación, vuelve a la configuración del sistema en lugar de a la pantalla de inicio, como si la actividad de configuración se hubiera iniciado primero y luego mi actividad. Si luego inicio la aplicación desde el teléfono, todo lo que recibo son las configuraciones del sistema una vez más.

La aplicación está escuchando la acción VIEW para una subcadena de URL específica, y cuando inicio la aplicación usando una URL coincidente obtengo el mismo resultado que cuando lo inicio desde Eclipse, la aplicación se inicia, pero cuando vuelvo vuelvo a la configuración.

He intentado buscar en Google para este problema, y ​​todo lo que pude encontrar fue algo sobre el estado de ahorro de Android cuando una aplicación muere, pero sin ninguna información sobre cómo restablecer este estado. He intentado desinstalar la aplicación, eliminar la configuración del sistema, reiniciar el teléfono, volver a instalar, borrar los datos de la aplicación ... sin suerte ...

Para lo que vale, aquí está la definición de mi actividad principal del manifiesto,

<activity android:name=".HomeActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:clearTaskOnLaunch="true" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="android.intent.category.BROWSABLE"></category> <data android:pathPrefix="/isak-web-mobile/smart/" android:scheme="http" android:host="*"></data> </intent-filter> </activity>

Y aquí está la línea logcat de cuando intento iniciar mi aplicación, nada acerca de cualquier configuración en cualquier lugar.

I/ActivityManager( 1301): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=se.opencare.isak/.HomeActivity }

Cuando lanzo desde Eclipse también obtengo esta línea (como es de esperar),

I/ActivityManager( 1301): Start proc se.opencare.isak for activity se.opencare.isak/.HomeActivity: pid=23068 uid=10163 gids={3003, 1007, 1015}

Si es importante, el teléfono es un HTC Desire Z que funciona con 2.2.1.

Actualmente, esta es mi HomeActividad,

public class HomeActivity extends Activity { public static final String TAG = "HomeActivity"; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult(" + requestCode + ", " + resultCode + ", " + data + ")"); super.onActivityResult(requestCode, resultCode, data); } @Override protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate(" + savedInstanceState + ")"); super.onCreate(savedInstanceState); } @Override protected void onDestroy() { Log.d(TAG, "onDestroy()"); super.onDestroy(); } @Override protected void onPause() { Log.d(TAG, "onPause()"); super.onPause(); } @Override protected void onPostCreate(Bundle savedInstanceState) { Log.d(TAG, "onPostCreate(" + savedInstanceState + ")"); super.onPostCreate(savedInstanceState); } @Override protected void onPostResume() { Log.d(TAG, "onPostResume()"); super.onPostResume(); } @Override protected void onRestart() { Log.d(TAG, "onRestart()"); super.onRestart(); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { Log.d(TAG, "onRestoreInstanceState(" + savedInstanceState + ")"); super.onRestoreInstanceState(savedInstanceState); } @Override protected void onResume() { Log.d(TAG, "onResume()"); super.onResume(); } @Override protected void onStart() { Log.d(TAG, "onStart()"); super.onStart(); } @Override protected void onStop() { Log.d(TAG, "onStop()"); super.onStop(); } @Override protected void onUserLeaveHint() { Log.d(TAG, "onUserLeaveHint()"); super.onUserLeaveHint(); } }

Nada (de lo anterior) se escribe en el registro.

Después de leer la respuesta de Blundell, he intentado cambiar la configuración de launchMode / clearTaskOnLaunch, con los siguientes resultados,

  • Situación A: elimino launchMode y clearTaskOnLaunch: el mismo problema que antes
  • Situación B: elimino clearTaskOnLaunch y mantengo launchMode = "singleInstance": otro problema
    • Abra la aplicación - My HomeActivity está mostrando
    • Haga clic en un botón para abrir otra actividad dentro de mi aplicación: se abre como debería
    • Haga clic en el botón de retroceso del sistema - me devuelve a la configuración del sistema
    • Haga clic en el botón de retroceso del sistema otra vez - Regresé a mi HomeActivity
    • Otro clic en el botón de retroceso me lleva de vuelta a la pantalla de inicio de Android
  • Situación C: elimino solo launchMode y mantengo clearTaskOnLaunch: el mismo problema que antes
  • Situación D: elimino clearTaskOnLaunch y establezco launchMode = "singleInstance": igual que en la situación B

He probado esto en mi teléfono, pero parece funcionar correctamente aquí ... ¿Qué sucede si intentas crear un nuevo proyecto y luego simplemente copias el código en él? Funcionó para mí, quizás funcione para ti ...

Sospecho que tiene algo que ver con su cambio de versión de Eclipse, que podría usar una configuración diferente de la versión que usó anteriormente, por lo tanto, la configuración inicial es inútil ...


Mis 2 centavos

Usted podría mirar en la actividad de lanzamiento de la aplicación.

Básicamente, lo que creo que podría estar sucediendo es que su aplicación se inicie en la misma "Pila" que la configuración, por lo que el sistema operativo enviará la configuración a la pantalla y luego cargará su actividad en la parte superior de esa pila.

Podrías intentar agregar:

android:launchMode="singleInstance"

en su etiqueta <activity /> de su archivo de manifiesto. Esto iniciará una nueva pila para su aplicación y solo su aplicación.

Esto puede solucionar el problema, pero puede haber otra causa y esto puede causar efectos adversos en función de cómo funciona su aplicación. Eche un vistazo a la documentación para obtener más información: Android:LaunchMode

EDITAR

Leyendo tu manifiesto, ¿por qué no simplemente eliminas android:launchMode="singleTop" y dejas que se inicie con el valor predeterminado?

También está emparejando esto con: android:clearTaskOnLaunch , ya que el sistema operativo tiene la actividad de configuración y su actividad como la misma tarea , puede estar eliminando la actividad de "raíz", que es la configuración y no su aplicación. ¿Hay alguna razón por la que tenga esto, elimínelo y vuelva a intentarlo?


No está llamando a setContentView () desde HomeActivity (según el código agregado por usted). Y cuando no está presente, los diferentes dispositivos se comportan de manera diferente, como en el emulador, verá "Aplicación no instalada en su teléfono". Intenta configurar la vista de contenido.


Tenga en cuenta que no soy un desarrollador de Android, pero tengo un teléfono con Android y creo que este problema es bastante interesante.

Para resumir lo que he leído sobre este problema hasta ahora aquí, me parece que lo siguiente puede ser la causa raíz de este problema:

  • Utiliza clearTaskOnLaunch, que borra todos los intentos / actividades / tareas / whatever_buzzword_is_used_for_this cuando se inicia tu aplicación.
  • Android parece recordar permanentemente el último estado de la aplicación en alguna (lo que ahora llamaré) la base de datos de estado interna global (GISD por brevedad) que no se puede borrar tan fácilmente (al menos no con la desinstalación de la aplicación, reinicio, borrado de intentos, etc.).
  • Android intenta volver a abrir la aplicación con su último estado. Si no hay actividad actual, esta información se toma del GISD, por lo que en su caso es "configuración del sistema".
  • No hay manera (o se desconoce cómo) borrar el estado que se mantiene en el GISD. (Tu pregunta es cómo hacerlo).

Si esto es cierto, se trata claramente de un problema telefónico, un error importante en Android, ¡ya que probablemente puedas bloquear las aplicaciones! Todo lo que debes hacer es seguir:

  • De alguna manera, provoque una cosa similar como clearTaskOnLaunch, que debería ser posible, para la aplicación que desee.
  • Truco de la aplicación para iniciar otra aplicación como "Configuración del sistema": muchas aplicaciones hacen esto para habilitar WiFi o similar, pero creo que algunas personas inteligentes (léase: no yo) encontrarán la manera de hacerlo para prácticamente cualquier aplicación.
  • Ahora mata la aplicación en este estado.

Android recordará ese estado en el GISD y si intenta iniciar la aplicación desde la pantalla de inicio, esto fallará en el futuro. Bonito.

Sin embargo, incluso en ausencia de una solución, es posible que se pueda volver a activar la aplicación de la misma manera:

  • Inicie su aplicación con una Actividad tal que se inicie. Mientras escribes, esto funciona para ti.
  • Aplique lo que hace clearTaskOnLaunch. (Realmente no tengo idea de cómo, pero usted, como desarrollador de Android, probablemente lo sepa).
  • Deje que su aplicación inicie una tercera aplicación de modo que esta tercera aplicación se convierta en el estado global.
  • Mata tu aplicación.

Quizás el tiempo y la secuencia son importantes, por lo que quizás tenga que abandonar la tercera aplicación después de que se elimine la aplicación, quizás tenga que sacar la batería de su teléfono en el momento adecuado, tal vez deba usar algunas cosas extrañas de ADB para evitar que su teléfono se detenga. haga lo correcto, quizás necesite otra secuencia de acciones o todavía falta algo, lo que sea, incluso descubrir cómo provocar su tipo de error puede ser difícil, pero gracias a su descubrimiento sabemos que existe tal cosa.

Si puede hacer que Android inicie la tercera aplicación desde la pantalla de Inicio en lugar de su aplicación, esto confirmaría que efectivamente puede solucionar ese problema. Si esto no funciona, es imposible evitar que Android invoque la configuración del sistema en lugar de tu aplicación, entonces, sin duda, Android tiene un gran problema, ya que es probable que alguien encuentre la manera de bloquear las aplicaciones de forma permanente en todos esos preciosos teléfonos ( ab) utilizando ese error.

Sin embargo, si el paso anterior funciona, el último paso ahora es permitir que la tercera aplicación vuelva a iniciarse en la pantalla principal de la aplicación:

  • Comience su aplicación.
  • Esto lanzará la tercera aplicación.
  • Aplique lo que hace clearTaskOnLaunch.
  • Deja que la tercera aplicación inicie la pantalla principal de tu aplicación (o lo que quieras)
  • Matar la tercera aplicación (y tal vez su aplicación).

Ahora el estado de actividad global volverá a establecerse en su aplicación, si todo va bien, la tercera aplicación tampoco debería verse afectada.

Tenga en cuenta que no estoy seguro de que esto se pueda hacer realmente, ya que no puedo probarlo yo mismo. ¡Y habiendo dicho eso todo, estoy de acuerdo en que ciertamente necesitamos ser una mejor manera de reparar este problema!

Pero interesante sería ver qué sucede, si su aplicación tiene el estado de la tercera aplicación y la tercera aplicación tiene el estado de su aplicación. ¿Esto conduce a un bucle sin fin?

También es interesante lo que sucede si desinstala la tercera aplicación. ¿Esto limpia el lanzamiento automático en esa aplicación o te deja indefenso?

Como un teléfono Android en línea (solo), debo decir, ese es un buen lío que has encontrado. Y es por eso que estoy muy interesado si hay una solución, ya que hacer un restablecimiento de fábrica no puede considerarse una solución. Leer: Esto no es solo un problema del desarrollador, también afecta a los usuarios de Android.

PD: Por favor, perdone mi mal inglés, la duración de esta publicación, no use las palabras de moda adecuadas y no publico en un tema del que no soy un experto, por lo que mi respuesta es un poco OT. Sin embargo hago esto con HTH.