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:
- onCreate ()
- onStart ()
- En resumen()
- Actividad pausa tiempo de espera para HistoryRecord
- en pausa ()
- 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.
}
}