quitar - ocultar navigation bar android studio
Android: realizar una parada de la actividad que no se reanuda (3)
Cuando empujo mi aplicación al fondo, y hago otras cosas como whatsapp o sms, en Reenume funciona muy bien.
Pero recientemente descubrí que cuando abro / lanzo la aplicación de Facebook mientras mi aplicación está en segundo plano, no sé qué pasa ...
Pero en Reesume, la aplicación se comporta mal ...
No hagas lo que se requiere hacer, pero cuando regrese a la página de inicio y regrese, funciona bien. Por favor, ayúdame ... ¿cómo arreglarlo?
Logcat con todos los mensajes (sin filtro)
10-15 12:53:59.899: I/Adreno-EGL(32033): Remote Branch: quic/LNX.LA.3.5.1_RB1.1
10-15 12:53:59.899: I/Adreno-EGL(32033): Local Patches: NONE
10-15 12:53:59.899: I/Adreno-EGL(32033): Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 + NOTHING
10-15 12:53:59.924: D/OpenGLRenderer(32033): Enabling debug mode 0
10-15 12:54:00.000: V/AlarmManager(7677): sending alarm Alarm{42cfa490 type 3 android}
10-15 12:54:00.110: I/ActivityManager(7677): Displayed uk.org.humanfocus.hfi/.EvaluateTrainingActivity: +838ms
10-15 12:54:00.114: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:00.114: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:00.114: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:02.258: V/AlarmManager(7677): sending alarm Alarm{42ebd600 type 1 com.facebook.katana}
10-15 12:54:02.274: V/AlarmManager(7677): sending alarm Alarm{42ec0ff0 type 1 com.android.chrome}
10-15 12:54:02.428: D/hardware_info(7386): hw_info_append_hw_type : device_name = speaker
10-15 12:54:03.011: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=android.net.conn.INET_CONDITION_ACTION flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{41fdecd0 u0 ReceiverList{42b2f608 31941 com.facebook.katana/10103/u0 remote:429a17e8}}
10-15 12:54:03.011: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{41fdecd0 u0 ReceiverList{42b2f608 31941 com.facebook.katana/10103/u0 remote:429a17e8}}
10-15 12:54:03.118: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:03.118: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:03.118: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:03.140: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:03.141: D/GCoreFlp(8174): Unknown pending intent to remove.
10-15 12:54:03.145: W/fb4a(:<default>):AbstractMqttPushService(31941): Attempt to start service that is already started
10-15 12:54:03.242: D/WifiStateMachine(7677): handleMessage: E msg.what=131155
10-15 12:54:03.242: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:03.243: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:03.245: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:03.319: D/dalvikvm(31941): GC_CONCURRENT freed 1833K, 9% free 20190K/22072K, paused 5ms+7ms, total 86ms
10-15 12:54:03.320: D/dalvikvm(31941): WAIT_FOR_CONCURRENT_GC blocked 68ms
10-15 12:54:03.323: W/MediaPlayer-JNI(31941): MediaPlayer finalized without being released
10-15 12:54:03.452: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{42b51d68 u0 ReceiverList{429feb50 31941 com.facebook.katana/10103/u0 remote:41fb8788}}
10-15 12:54:03.573: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42914bc8 to deserialize [simple type, class com.facebook.common.util.TriState]
10-15 12:54:03.587: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42bb3100 to deserialize [simple type, class com.facebook.contacts.graphql.contactprofiletype.ContactProfileType]
10-15 12:54:03.957: D/dalvikvm(31941): GC_CONCURRENT freed 3400K, 15% free 20455K/23952K, paused 4ms+7ms, total 88ms
10-15 12:54:03.957: D/dalvikvm(31941): WAIT_FOR_CONCURRENT_GC blocked 75ms
10-15 12:54:04.099: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using BeanSerializer for com.facebook.katana.newbookmark.qe.NewBookmarkConfig to serialize class com.facebook.katana.newbookmark.qe.NewBookmarkConfig
10-15 12:54:04.119: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:04.120: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:04.120: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:04.124: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:04.177: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42a30980 to deserialize [simple type, class com.facebook.platform.webdialogs.PlatformWebViewActionManifest$FetchState]
10-15 12:54:04.197: I/dalvikvm(31941): Could not find method com.android.internal.widget.ILockSettings$Stub.a, referenced from method com.facebook.keyguardtype.LockSettingsServiceKeyguardTypeResolver.b
10-15 12:54:04.197: W/dalvikvm(31941): VFY: unable to resolve static method 5338: Lcom/android/internal/widget/ILockSettings$Stub;.a (Landroid/os/IBinder;)Lcom/android/internal/widget/ILockSettings;
10-15 12:54:04.197: D/dalvikvm(31941): VFY: replacing opcode 0x71 at 0x0023
10-15 12:54:04.440: I/SBar.NetworkController(7758): onSignalStrengthsChanged SignalStrength: 19 0 -120 -160 -120 -1 -1 99 2147483647 2147483647 2147483647 2147483647 2147483647 gsm|lte 0 -108 -1 false 5 5 0 0 0 99 99 99 5 level=5
10-15 12:54:04.814: V/WebViewChromiumFactoryProvider(31941): Binding Chromium to main looper Looper (main, tid 1) {41f8cbd0}
10-15 12:54:04.815: I/LibraryLoader(31941): Expected native library version number "",actual native library version number ""
10-15 12:54:04.816: I/chromium(31941): [INFO:library_loader_hooks.cc(116)] Chromium logging enabled: level = 0, default verbosity = 0
10-15 12:54:04.817: I/BrowserStartupController(31941): Initializing chromium process, renderers=0
10-15 12:54:04.822: E/AudioManagerAndroid(31941): BLUETOOTH permission is missing!
10-15 12:54:04.864: W/chromium(31941): [WARNING:proxy_service.cc(890)] PAC support disabled because there is no system implementation
10-15 12:54:05.121: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:05.121: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:05.122: D/WifiStateMachine(7677): processMsg: L2ConnectedState
Y esto es onResume ()
super.onResume();
if (backgroundThreadRunning == true) {
backgroundThreadRunning = false;
}
if (Constants.isVideoEditing)
editingProgress.setVisibility(View.VISIBLE);
else
editingProgress.setVisibility(View.GONE);
if (Constants.isAudioProcessing)
addAudioProgress.setVisibility(View.VISIBLE);
else
addAudioProgress.setVisibility(View.GONE);
if (isHomeKeyPressed() && !(isRecentActivity)) {
isRecentActivity = false;
homeKeyPressed(false);
AlertDialog.Builder ab = new AlertDialog.Builder(
CreateTrainingActivity.this);
ab.setMessage(
"Due to Other Application Launches, video process will be cancelled!/nAre you sure you want to cancel?")
.setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
}
};
EDITAR: CÓMO FIJÉ EL PROBLEMA
Escribí este código en el método onResume()
try {
// check if any view exists on current view
style = ((Button) findViewById(R.id.xyz_button));
} catch (Exception e) {
// Button was not found
// It means, your button doesn''t exist on the "current" view
// It was freed from the memory, therefore stop of activity was performed
// In this case I restart my app
Intent i = new Intent();
i.setClass(getApplicationContext(), MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
// Show toast to the user
Toast.makeText(getApplicationContext(), "Data lost due to excess use of other apps", Toast.LENGTH_LONG).show();
}
Afortunadamente ya ha tratado el problema, pero hay un error en su código, quizás relacionado:
if (backgroundThreadRunning = true) {
backgroundThreadRunning = false;
}
está asignando en lugar de comparar en la declaración "si". Debiera ser:
if (backgroundThreadRunning == true) {
backgroundThreadRunning = false;
}
o
if (backgroundThreadRunning) {
backgroundThreadRunning = false;
}
Solo dando mis 50 centavos sobre el tema. Capturar la excepción es una posibilidad, pero la forma correcta de lidiar con el problema de una actividad que el sistema está eliminando por sus recursos en segundo plano es un problema común en Android y según Google la solución para esto es:
onPause () es donde tratas con el usuario que deja tu actividad. Lo que es más importante, cualquier cambio realizado por el usuario debe comprometerse en este punto (por lo general, al ContentProvider que contiene los datos).
El énfasis es mío Pero lo que esto significa es que los ciclos de vida de Android están diseñados para que, en condiciones normales, se onPause
como Activity
o se envíe un Fragment
a un segundo plano. Insinúan esto en varias de las páginas de documentación de Android :
Cuando su actividad entre en pausa, el sistema llama al método onPause () en su Actividad, que le permite detener acciones en curso que no deberían continuar mientras está en pausa (como un video) o conservar cualquier información que debe guardarse permanentemente en el caso el usuario continúa dejando su aplicación. Si el usuario regresa a su actividad desde el estado en pausa, el sistema lo reanuda y llama al método onResume ().
Nota: Cuando su actividad recibe una llamada a onPause (), puede ser una indicación de que la actividad se pausará por un momento y el usuario podrá volver a centrarse en su actividad. Sin embargo, generalmente es la primera indicación de que el usuario está dejando su actividad.
Pero el recurso que probablemente podría ayudarlo son estos dos:
http://developer.android.com/training/basics/activity-lifecycle/stopping.html
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
Lo que probablemente está pasando con sus recursos perdidos es esto:
Cuando su actividad recibe una llamada al método onStop (), ya no es visible y debe liberar casi todos los recursos que no son necesarios mientras el usuario no lo esté usando. Una vez que se detiene su actividad, el sistema podría destruir la instancia si necesita recuperar la memoria del sistema. ... De forma predeterminada, el sistema usa el estado de la instancia de Bundle para guardar información sobre cada objeto de View en el diseño de su actividad (como el valor de texto ingresado en un objeto EditText). Por lo tanto, si su instancia de actividad se destruye y vuelve a crear, el estado del diseño se restaura a su estado anterior sin necesidad de código. Sin embargo, es posible que su actividad tenga más información de estado que desee restaurar, como las variables miembro que siguen el progreso del usuario en la actividad.
Nota: Para que el sistema Android restablezca el estado de las vistas en su actividad, cada vista debe tener una ID única, proporcionada por el atributo android: id.
Para guardar datos adicionales sobre el estado de la actividad, debe anular el método de devolución de llamada onSaveInstanceState (). El sistema llama a este método cuando el usuario abandona su actividad y le pasa el objeto Bundle que se guardará en caso de que su actividad se destruya inesperadamente. Si el sistema debe volver a crear la instancia de actividad más tarde, pasa el mismo objeto Bundle a los métodos onRestoreInstanceState () y onCreate ().
La solución correcta para esto es anular e implementar los métodos del ciclo de vida de la Actividad / Fragmento según sea necesario.
Dos ejemplos dados por http://developer.android.com/training/basics/activity-lifecycle/recreating.html :
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user''s current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Caution: Always call the superclass implementation of onSaveInstanceState() so the default implementation can save the state of the view hierarchy.
Y la operación de restauración inversa:
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
Una línea : parece que algunas de sus variables de actividad se liberaron de la memoria ya que el sistema operativo Android necesitaba memoria para la aplicación de Facebook.
Explicación : cuando una aplicación en primer plano necesita más memoria de la que está disponible, Android libera parte de la memoria de las aplicaciones que se ejecutan en segundo plano. Las tareas en primer plano siempre tienen mayor prioridad que las aplicaciones en segundo plano.
Entonces, lo que podría haberle sucedido a su aplicación mientras estaba en segundo plano es que algunas de sus variables han perdido sus valores que está utilizando en su onResume (). Debido a esto, tienen valores incorrectos o valores predeterminados (puede verificarlos con Sysout), ya que se vuelven a crear cuando vuelve a poner su aplicación en primer plano y debido a esto parte del código no funciona correctamente.