vida una tipos onstop onrestart developer cual ciclo aplicacion activity actividades android

una - onstop android



Por qué se llama al método onPause inmediatamente después de onCreate (6)

Comience un intento que verificará si el usuario está saliendo y lo vinculará a su botón de salida. Todavía no estoy seguro de lo que quieres ya que el código está incompleto

Estoy escribiendo una aplicación que muestra una actividad a tiempo fijo.

Comienzo la actividad desde el servicio con dicho código:

intent.setClass(context, FakeAction.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent);

en el método onCreate de FakeAction Requiero que el dispositivo se active e inicie el mensaje de sonido:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Hay una gran cantidad de código en onCreate para mostrar información en pantalla y comenzar el mensaje de sonido.

Aquí hay un método onPause:

@Override protected void onPause() { Log.i(TAG, "onPause"); //Stop mediaPlayer if(mp != null) { if(mp.isPlaying())mp.stop(); mp.release(); mp = null; } //Restore volume if(audioManager != null) { audioManager.setStreamVolume(AudioManager.STREAM_ALARM, savedVolume, 0); } //Stop minute timer handler.removeCallbacks(minuteReceiver); super.onPause(); }

Desafortunadamente, el método onPause () se llama inmediatamente después de onCreate. Así que mi mensaje de sonido se detiene inmediatamente.

Pero si la actividad se inicia cuando la pantalla no está bloqueada, no se llama a onPasue () inmediatamente después de onCreate ();

Aunque comento todas las cadenas "getWindow (). AddFlags ()", se llama a onPause () después de onCreate () cuando la pantalla está bloqueada.

La pregunta es ¿por qué se llama a onPause inmediatamente después de onCreate? ¿Cómo puedo distinguir el método de llamada inmediata de onPause () y llamada de onPause () cuando el usuario presiona el botón Atrás?

A continuación se muestra el código de la actividad. Yo uso el patrón MVP, por lo tanto, el código principal está en el presentador. Pero incluso si comento todas las llamadas del presentador (como hice en este ejemplo), se llama a onPause () inmediatamente después de onCreate ()

¿Puede tener una idea de que comience la actividad en AsyncTask? El AsyncTask se inicia desde el servicio. El servicio se detiene después de AsyncTask si finaliza.

public class FakeAction extends RoboActivity implements View.OnClickListener ,AlarmAction { private static final String TAG = "TA FakeAction"; @InjectView(R.id.aa_btn_Stop) Button btnStop; @InjectView(R.id.aa_btn_Snooze) Button btnSnooze; @InjectView(R.id.aa_tv_CurTime) TextView tvCurTime; @InjectView(R.id.aa_tv_CurDate) TextView tvCurDate; @InjectView(R.id.aa_tv_AlarmName) TextView tvAlarmName; @Inject public AlarmActionPresenter presenter; private Exception ex; @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "onCreate"); super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); setContentView(R.layout.alarm_action); try { //presenter.onCreate(this); } catch(Exception ex) { this.ex = ex; Log.e(TAG, "onCreate", ex); } btnStop.setOnClickListener(this); btnSnooze.setOnClickListener(this); } @Override protected void onPause() { Log.i(TAG, "onPause"); //presenter.onPause(); super.onPause(); } @Override public void onClick(View v) { Log.i(TAG, "onClick"); //presenter.onClick(v.getId()); } @Override public Bundle getIntentBundle() { return getIntent().getExtras(); } @Override public void setAlarmName(String alarmName) { tvAlarmName.setText(alarmName); } @Override public String getAlarmName() { return tvAlarmName.getText().toString(); } @Override public void setCurTime(String curTime) { tvCurTime.setText(curTime); } @Override public String getCurTime() { return tvCurTime.getText().toString(); } @Override public void setCurDate(String curDate) { tvCurDate.setText(curDate); } @Override public String getCurDate() { return tvCurDate.getText().toString(); } @Override public IAssetFileDescriptorMockable openFd(String assetName) throws IOException { Log.i(TAG, "openFd"); return new AssetFileDescriptorMockable(getAssets().openFd(assetName)); } }


Descubrí la solución de mi problema.

La razón por la que el onPause llamado después de onCreate es el ActivityManager. En el registro, he encontrado la línea inmediatamente después de onCreate: "Tiempo de espera de pausa de actividad para HistoryRecord" Por lo tanto, los próximos eventos ocurrieron en mi actividad:

  1. onCreate ()
  2. onStart ()
  3. En resumen()
  4. Actividad pausa tiempo de espera para HistoryRecord
  5. en pausa ()
  6. En resumen()

No sé cómo evitar el "Tiempo de espera de pausa de actividad para HistoryRecord", pero cambié mi aplicación para que empiece el mensaje de sonido en onResume (). Aunque se detiene en onPause (), se vuelve a iniciar en el siguiente onResume ().


Esto es lo que creo que sucede, entonces: su servicio crea su actividad y su actividad hace varias cosas, como despertar la pantalla y despedir al guardaespaldas. Pero no es instantáneo, lo que significa que es probable que la actividad del protector del teclado se despierte antes de ser descartada, lo que detiene su actividad por un corto tiempo.

Creo que deberías hacer esto: http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/

Trata con ello usando la intención. Captura la intención diciendo que la pantalla está activada y la intención de que la pantalla está desactivada.

El ciclo funcionará así, creo:

  • Vas a crear tu actividad
  • Tu actividad continuará. Pausa mientras intentas descartar el teclado y afinar algunas cosas.
  • Tu actividad despertará de nuevo.
  • Tu actividad recibirá la pantalla en intención.

Eso significa: cuando se llama onPause, la pantalla está apagada! Significado: solo necesitas una bandera, y si esta marca dice que la pantalla aún está apagada, no detienes la música.

Está un poco sucio, pero debería funcionar perfectamente.


Resolví mi problema probando si la pantalla está encendida o apagada con este código:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); if (!powerManager.isScreenOn()){ return; }

Por lo tanto, el método onPause del código n solo se realiza si la pantalla está activada. Cuando se enciende la pantalla y se llama onPause, el método isScreenOn de PowerManager devuelve false.


Si tiene ES File Explorer , FORCE STOP . De alguna manera, interrumpen el ciclo de vida de su aplicación (los comentarios sugieren algún tipo de superposición) .

Mi problema con onResume se causó dos veces fue porque onPause fue llamado de alguna manera después de que se creó la actividad ... algo estaba interrumpiendo mi aplicación.

Y esto solo ocurre después de que se abre por primera vez después de la instalación o se construye desde el estudio .

Obtuve la pista de otra publicación y descubrí que era debido a ES File Explorer. ¿Por qué parece que se llama onResume () dos veces?

Tan pronto como fuerzo a detener ES File Explorer , este comportamiento de hipo ya no ocurre ... es frustrante saberlo después de probar muchas otras soluciones propuestas. Así que ten cuidado con cualquier otra aplicación de interrupción como esta.


You can distinguish onPause() call between Acticity itself and back button press. onBackPressed(){ // set isBackPressed = true; } onPause(){ if(isBackPressed ){ // exit due to back pressed. }else{ // normal exit. } }