2010-11-29 57 views
0

onRestoreInstanceState(捆绑savedInstanceState)保存对象的Android不工作

不歌厅叫,我下面粘贴我的代码。实际上,我想重绘当我的活动在后台进行时保存的所有点。

package com.geniteam.mytest; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 

public class Tutorial2D extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(new Panel(this)); 
    } 
    @Override 
    protected void onSaveInstanceState(Bundle outState) {  
    super.onSaveInstanceState(outState); 
    Panel panel = new Panel(this); 
    outState.putSerializable("test", panel._graphics);  

    } 
    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) {  
    super.onRestoreInstanceState(savedInstanceState); 
    Panel panel = new Panel(this); 
    panel.set_graphics((ArrayList<GraphicObject>) savedInstanceState.getSerializable("test"));  
    } 

    class Panel extends SurfaceView implements SurfaceHolder.Callback { 
     private TutorialThread _thread;   
     private ArrayList<GraphicObject> _graphics = new ArrayList<GraphicObject>(); 

     public ArrayList<GraphicObject> get_graphics() { 
    return _graphics; 
    } 

    public void set_graphics(ArrayList<GraphicObject> graphics) { 
    _graphics = graphics; 
    } 

    public Panel(Context context) { 
      super(context); 
      getHolder().addCallback(this); 
      _thread = new TutorialThread(getHolder(), this); 
      setFocusable(true); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      synchronized (_thread.getSurfaceHolder()) { 
       // if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        GraphicObject graphic = new GraphicObject(BitmapFactory.decodeResource(getResources(), R.drawable.icon)); 
        graphic.getCoordinates().setX((int) event.getX() - graphic.getGraphic().getWidth()/2); 
        graphic.getCoordinates().setY((int) event.getY() - graphic.getGraphic().getHeight()/2); 
        _graphics.add(graphic); 
       //} 
       return true; 
      } 
     } 

     @Override 
     public void onDraw(Canvas canvas) { 
      canvas.drawColor(Color.BLACK); 
      Bitmap bitmap; 
      GraphicObject.Coordinates coords; 
      for (GraphicObject graphic : _graphics) { 
       bitmap = graphic.getGraphic(); 
       coords = graphic.getCoordinates(); 
       canvas.drawBitmap(bitmap, coords.getX(), coords.getY(), null); 
      } 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
      // TODO Auto-generated method stub 
     } 


     public void surfaceCreated(SurfaceHolder holder) { 
      try{ 
     _thread.setRunning(true); 
      _thread.start(); 
      }catch(Exception ex){ 
      _thread = new TutorialThread(getHolder(), this); 
      _thread.start(); 
      } 

     } 


     public void surfaceDestroyed(SurfaceHolder holder) { 
      // simply copied from sample application LunarLander: 
      // we have to tell thread to shut down & wait for it to finish, or else 
      // it might touch the Surface after we return and explode 
      boolean retry = true; 
      _thread.setRunning(false); 
      while (retry) { 
       try { 
        _thread.join(); 
        retry = false; 
       } catch (InterruptedException e) { 
        // we will try it again and again... 
       } 
      } 
     } 
    } 

    class TutorialThread extends Thread { 
     private SurfaceHolder _surfaceHolder; 
     private Panel _panel; 
     private boolean _run = false; 

     public TutorialThread(SurfaceHolder surfaceHolder, Panel panel) { 
      _surfaceHolder = surfaceHolder; 
      _panel = panel; 
     } 

     public void setRunning(boolean run) { 
      _run = run; 
     } 

     public SurfaceHolder getSurfaceHolder() { 
      return _surfaceHolder; 
     } 

     @Override 
     public void run() { 
      Canvas c; 
      while (_run) { 
       c = null; 
       try { 
        c = _surfaceHolder.lockCanvas(null); 
        synchronized (_surfaceHolder) { 
         _panel.onDraw(c); 
        } 
       } finally { 
        // do this in a finally so that if an exception is thrown 
        // during the above, we don't leave the Surface in an 
        // inconsistent state 
        if (c != null) { 
         _surfaceHolder.unlockCanvasAndPost(c); 
        } 
       } 
      } 
     } 
    } 

    class GraphicObject { 
     /** 
     * Contains the coordinates of the graphic. 
     */ 
     public class Coordinates { 
      private int _x = 100; 
      private int _y = 0; 

      public int getX() { 
       return _x + _bitmap.getWidth()/2; 
      } 

      public void setX(int value) { 
       _x = value - _bitmap.getWidth()/2; 
      } 

      public int getY() { 
       return _y + _bitmap.getHeight()/2; 
      } 

      public void setY(int value) { 
       _y = value - _bitmap.getHeight()/2; 
      } 

      public String toString() { 
       return "Coordinates: (" + _x + "/" + _y + ")"; 
      } 
     } 

     private Bitmap _bitmap; 
     private Coordinates _coordinates; 

     public GraphicObject(Bitmap bitmap) { 
      _bitmap = bitmap; 
      _coordinates = new Coordinates(); 
     } 

     public Bitmap getGraphic() { 
      return _bitmap; 
     } 

     public Coordinates getCoordinates() { 
      return _coordinates; 
     } 
    } 
} 
+0

家伙和gals请投我。我需要更多的点:) thnx – 2010-11-29 07:48:53

回答

2

onRestoreInstanceState只在应用程序被销毁并重新创建时才被调用。将应用程序置于后台,然后再次启动应用程序将调用onResume,但不是onRestoreInstanceState。