我有一个名为StartupActivity的简单Activity,它在我的应用程序启动时播放,并在意图中打开MainActivity。我注意到如果我将清单更改为直接打开到MainActivity,那么我的应用程序在MainActivity上使用7mb或更少的RAM。我相信这是一个内存泄漏。我找不到它,有人能帮帮我吗
public class StartupActivity extends Activity {
private MediaManager mp;
private CountDownTimer time;
private boolean activityHasExited;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_startup);
activityHasExited=false;
mp = new MediaManager();
mp.playSoundClip(this,R.raw.intro);
//display the logo
time = new CountDownTimer(4000,1000){
@Override
public void onTick(long millisUntilFinished){
}
@Override
public void onFinish(){
if(!activityHasExited){
Intent i= new Intent(StartupActivity.this, MainActivity.class);
startActivity(i);
time=null;
StartupActivity.this.finish();
}
}
}.start();
}
@Override
public void onDestroy(){
super.onDestroy();
if(time!=null){
time.cancel();
time=null;
}
mp.stop();
activityHasExited=true;
}
}
支持班:
//source: http://stackoverflow.com/questions/18254870/play-a-sound-from-res-raw
public class MediaManager {
private MediaPlayer mMediaPlayer;
public void stop() {
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
}
public void playSoundClip(Context c, int rid) {
stop();
mMediaPlayer = MediaPlayer.create(c, rid);
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stop();
}
});
mMediaPlayer.start();
}
}
编辑:将onDestroy更改为onStop(按照 ChallengeAccepted's或Simon的建议)如果用户在倒计时结束前回家,活动将结束,这很好!当我包含介绍活动时,我仍然看到更多的内存使用量。由于此活动是一次性使用,我的目标是彻底清理并尽可能保持我的应用程序。
答案 0 :(得分:1)
这不是内存泄漏。如果您打开活动A然后打开活动B,第一个将在内存中继续,直到Android需要内存或Android认为活动A可能不会再次打开。此外,在您的情况下,活动A正在播放比平常活动消耗更多的东西。
答案 1 :(得分:0)
你的onDestroy方法甚至onStop方法都不会被保证被调用,这就是为什么谷歌建议我们使用onPause,因为这是为了保证被调用。
您可以点击here了解有关Android生命周期的更多信息。