启动活动内存泄漏

时间:2014-07-26 07:07:06

标签: java android memory-management memory-leaks media

我有一个名为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的建议)如果用户在倒计时结束前回家,活动将结束,这很好!当我包含介绍活动时,我仍然看到更多的内存使用量。由于此活动是一次性使用,我的目标是彻底清理并尽可能保持我的应用程序。

2 个答案:

答案 0 :(得分:1)

这不是内存泄漏。如果您打开活动A然后打开活动B,第一个将在内存中继续,直到Android需要内存或Android认为活动A可能不会再次打开。此外,在您的情况下,活动A正在播放比平常活动消耗更多的东西。

答案 1 :(得分:0)

你的onDestroy方法甚至onStop方法都不会被保证被调用,这就是为什么谷歌建议我们使用onPause,因为这是为了保证被调用。

您可以点击here了解有关Android生命周期的更多信息。