2013-05-08 75 views
0

我有2 Activities 1主菜单和另一个游戏窗口。我需要在onSaveInstanceState()方法中保存多少东西?

的问题是,当手机的home键被按下前测“游戏窗口” ActivityonStop()方法,在这一点上都可以,但是当我回到我的应用程序崩溃。

我研究了这个问题,我认为它与保存mplayer对象的状态有关,因为日志说了什么,我试图保存mplayer对象的状态,但应用程序仍然有同样的问题。

我需要保存测试视图的所有变量吗?我很感激帮助。

第二活动

public class pretest extends Activity { 
private MediaPlayer mplayer; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

requestWindowFeature(Window.FEATURE_NO_TITLE); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.Layou  tParams.FLAG_FULLSCREEN); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
Toast.makeText(this, "onCreate2", Toast.LENGTH_SHORT).show(); 
if(mplayer!=null){mplayer.release();} 

    mplayer=MediaPlayer.create(this, R.raw.forest); 

View test = new test(this); 
mplayer.seekTo(0); 
mplayer.setLooping(true); 
mplayer.start(); 

    setContentView(test); 
    } 

     @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     mostrarSalir(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 


     @Override 
    public void onStart(){ 
super.onStart(); 

Toast.makeText(this, "onStart2", Toast.LENGTH_SHORT).show(); 
     } 

    @Override 
    public void onStop(){ 
super.onStop(); 

Toast.makeText(this, "onStop2", Toast.LENGTH_SHORT).show(); 
      } 

    @Override 
    public void onRestart(){ 
super.onRestart(); 

Toast.makeText(this, "onRestart2", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onDestroy(){ 
super.onDestroy(); 

Toast.makeText(this, "onDestroy2", Toast.LENGTH_SHORT).show(); 
    } 



@Override 
    public void onPause(){ 
super.onPause(); 
Toast.makeText(this, "onPause2", Toast.LENGTH_SHORT).show(); 
//LIBERA A MEDIA PLAYER 
if(mplayer!=null){mplayer.release();} 

    } 

    private void mostrarSalir(){ 
    AlertDialog.Builder dialog = new AlertDialog.Builder(this); 

    dialog.setMessage("¿Desea Regresar al menu principal?"); 
    dialog.setCancelable(false); 
    dialog.setPositiveButton("Si", new DialogInterface.OnClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 


     finish(); 



    } 
    }); 
    dialog.setNegativeButton("No", new DialogInterface.OnClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 


    Toast toast1 = 
        Toast.makeText(getApplicationContext(), 
          ":D!", Toast.LENGTH_SHORT); 

       toast1.show(); 

    dialog.cancel(); 

    } 
}); 
    dialog.show(); 
} 

    @Override 
    public void onResume(){ 


super.onResume(); 
//reinicia 
Toast.makeText(this, "onResume2", Toast.LENGTH_SHORT).show(); 
mplayer.seekTo(0); 
    mplayer.start(); 

    } 

    @Override 
    protected void onSaveInstanceState(Bundle estadoguardado){ 

super.onSaveInstanceState(estadoguardado); 
if(mplayer!=null){ 

    int pos=mplayer.getCurrentPosition(); 
    estadoguardado.putInt("posicion", pos); 
} 

    } 

    @Override  
    protected void onRestoreInstanceState(Bundle estadoguardado) 
    { 

    super.onRestoreInstanceState(estadoguardado); 


if(estadoguardado!=null&&mplayer!=null){ 
int pos=estadoguardado.getInt("posicion"); 
mplayer.seekTo(pos); 

     } 

    } 

    } 

错误日志的代码:

05-08 02:55:32.036: E/AndroidRuntime(7904): FATAL EXCEPTION: main 
    05-08 02:55:32.036: E/AndroidRuntime(7904): java.lang.RuntimeException: Unable to  resume activity {com.example.brain/com.example.brain.pretest}:        java.lang.IllegalStateException 
    05-08 02:55:32.036: E/AndroidRuntime(7904):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2214) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2229) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1019) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at android.os.Handler.dispatchMessage(Handler.java:130) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at android.os.Looper.loop(SourceFile:351) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at android.app.ActivityThread.main(ActivityThread.java:3814) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at java.lang.reflect.Method.invokeNative(Native Method) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at java.lang.reflect.Method.invoke(Method.java:538) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
05-08 02:55:32.036: E/AndroidRuntime(7904): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:659) 
    05-08 02:55:32.036: E/AndroidRuntime(7904): at dalvik.system.NativeStart.main(Native Method) 
05-08 02:55:32.036: E/AndroidRuntime(7904): Caused by: java.lang.IllegalStateException 
05-08 02:55:32.036: E/AndroidRuntime(7904): at android.media.MediaPlayer.seekTo(Native Method) 
    05-08 02:55:32.036: E/AndroidRuntime(7904): at com.example.brain.pretest.onResume(pretest.java:135) 
    05-08 02:55:32.036: E/AndroidRuntime(7904): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1189) 
    05-08 02:55:32.036: E/AndroidRuntime(7904): at android.app.Activity.performResume(Activity.java:3896) 
    05-08 02:55:32.036: E/AndroidRuntime(7904): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2204) 
05-08 02:55:32.036: E/AndroidRuntime(7904): ... 10 more 
+0

当onPause被调用时,您将释放MediaPlayer实例持有的资源,并且稍后再回到应用程序时,您正尝试调用旧实例的seekTo方法! – WeNeigh 2013-05-08 10:12:22

回答

0

在你的onPause你释放MediaPlayer。这样就释放了它在子系统中链接的所有资源。

这应该是这样的:

@Override 
public void onPause() 
{ 
    super.onPause(); 
    Toast.makeText(this, "onPause2", Toast.LENGTH_SHORT).show(); 
    //LIBERA A MEDIA PLAYER 
    if (mplayer != null) 
    { 
     mplayer.release(); 
     mplayer = null; 
    } 

} 

但改变你的简历至:

@Override 
public void onResume() 
{ 


    super.onResume(); 
    //reinicia 
    Toast.makeText(this, "onResume2", Toast.LENGTH_SHORT).show(); 
    if (mplayer == null) 
     mplayer = MediaPlayer.create(this, R.raw.forest); 
    mplayer.seekTo(0); 
    mplayer.setLooping(true); 
    mplayer.start(); 
} 

你可以调整这个多一点,因为你实际上应该在onStoprelease并在onStart创建。

然后你pause在和playonStart这样你保留的引用,除非你真的离开了应用程序。应该使得前进和后退更平稳。

+0

谢谢! ,最后一个问题,所以保护无效的onSaveInstanceState(Bundle estadoguardado)方法仅在活动调用onDestroy方法时使用? – 2013-05-08 20:52:12

+0

是的,它是在我记忆中的'onDestroy'之前调用的。 'onRestore'在'onCreate'之后被调用。 – 2013-05-09 10:29:27

相关问题