[英]Startup Activity Memory Leak
我有一个名为StartupActivity的简单活动,它在应用程序启动时播放,并有意地打开MainActivity。 我注意到,如果我更改清单以直接向MainActivity打开,则我的应用程序在MainActivity上使用的内存将减少7mb或更多。 我相信这是内存泄漏。 不过我找不到,有人可以帮我吗
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或Simon的建议),如果用户在倒计时结束之前到达首页,活动将结束。 与未包含Intro活动相比,我仍然看到更多的内存使用情况。 由于此活动是一次性使用,因此我的目标是完全清理并保持我的应用程序尽可能小。
这不是内存泄漏。 如果您先打开一个活动A,然后再打开一个活动B,则第一个活动将继续在内存中运行,直到Android需要内存,或者Android认为该活动A可能不会再次打开。 此外,在您的情况下,活动A正在播放比平常活动要消耗更多的东西。
永远不会保证您的onDestroy方法甚至onStop方法都不会被调用,这就是Google建议我们使用onPause的原因,因为它会被确保被调用。
您可以通过点击此处阅读有关android生命周期的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.