2012-11-26 7 views
6

Ich habe eine Aktivität, die von einem AlarmManager aufgerufen wird. Es ist eine Alarmmeldung.onStop vor onStart aufgerufen

Wenn die Aktivität vom Key Guard aufgerufen wird, geht der Lebenszyklus von onCreate -> onStart -> onResume -> onPause -> onStop und kehrt dann zu onCreate -> onStart -> onResume zurück.

Da es sich um eine Alarmaktivität handelt, habe ich die MediaPlayer.stop-Zeile in den Activity onStop eingefügt, aber jetzt stoppt der Alarmton gleich nach dem Start.

Wenn ich den MediaPlayer.stop in onDestroy setze, bekomme ich das richtige Verhalten, aber wenn der Benutzer die Home-Taste drückt, verschwindet die Aktivität und der Sound spielt weiter.

Jeder kann sagen, warum in dieser Situation onPause und onStop aufgerufen werden?

EDIT: Nach einigen Untersuchungen im Protokoll, fand ich diese Zeile:

11-26 17:39:01.273: I/ActivityManager(385): Activity reported stop, but no longer stopping: ActivityRecord{41827a90 u0 net.xisberto.workschedule/.AlarmMessageActivity} 

Antwort

5

OK, nach mehr als einem Jahr wurde mir klar, dass diese Frage nie eine Antwort bekam, obwohl ich das Problem in den Griff bekommen, so dass hier es geht:

Jetzt fange ich die MediaPlayer während onResume, aber ich tue es nicht wieder gestartet werden, wenn es bereits spielt:

@Override 
protected void onResume() { 
    super.onResume(); 
    ... 
    if (!mMediaPlayer.isPlaying()) { 
     mMediaPlayer.start(); 
    } 
    ... 
} 

Und Ich halte es während onStop, aber nur, wenn die Aktivität isFinishing:

@Override 
protected void onStop() { 
    super.onStop(); 
    if (isFinishing()) { 
     if (mMediaPlayer != null) { 
      mMediaPlayer.stop(); 
      mMediaPlayer.release(); 
      mMediaPlayer = null; 
     } 
    } else { 
     ... 
    } 
} 

während der beschriebenen Situation Da die Aktivität ist nicht Schlichten, aber Neustart (Konfigurationsänderung, glaube ich), der Mediaplayer nicht aufhören.

Mein Code ist nicht genau so, weil ich einige andere Funktionen verwende und ich benutze eine Benachrichtigung, um den Benutzer zurück zu der Aktivität zu bringen. Der vollständige Code ist hier: https://github.com/xisberto/workschedule/blob/master/src/net/xisberto/work_schedule/AlarmMessageActivity.java

0

Properbly gedreht Sie Ihr Gerät ohne diese Event-Handling.

Sie dies mit einer kleinen Änderung Ihrer Manifest umgehen kann:

<activity android:name=".MyActivity" 
     android:configChanges="orientation" 
     android:label="@string/app_name"> 
+0

Nein, ich habe das Gerät nicht gedreht. Ich bin mir sicher, denn das passiert immer, auch wenn das Gerät auf meinem Schreibtisch liegt. – Xisberto