按下Home按钮后失去对SurfaceView的关注

时间:2012-01-17 23:45:07

标签: android surfaceview android-activity

我正在开发一款基于此tutorial的游戏。 我设法使游戏的大部分工作,但当用户按下主页按钮时,我的游戏在后台继续运行,我可以使用onPause方法暂停它,除了它之外的所有东西都不会运行onResume方法。

当用户重新启动游戏时,没有调用任何方法,并且我的面板失去了焦点。

在按下主页按钮后将游戏发送到后台后,如何让它再次获得焦点?

我的活动代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    panel = new Panel(this);
    // requesting to turn the title OFF
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    // making it full screen        
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    // set our MainGamePanel as the View
    setContentView(panel);
    Log.d(TAG, "onCreate");
}



     @Override
 public void onStart(){
     super.onStart();
     Log.d(TAG,"onStart");
 }

 @Override
 public void onRestart(){
     super.onRestart();
     Log.d(TAG,"onRestart");

 }
 @Override
 public void onResume(){    
     super.onResume();
     Log.d(TAG, "onResume");        
 }

 @Override
 public void onSaveInstanceState(Bundle savedInstanceState) {
     super.onSaveInstanceState(savedInstanceState);
     Log.d(TAG, "onSaveInstance");      
 }

 @Override
 public void onRestoreInstanceState(Bundle savedInstanceState) {
     super.onRestoreInstanceState(savedInstanceState);
     Log.d(TAG, "onRestoreInstance");     
 }

 @Override
 public void onPause(){
     super.onPause();
     Log.d(TAG,"onpause");      
 }


 @Override
 public void onStop() {
  super.onStop();
  Log.d(TAG, "onStop..");
 }


 @Override
 public void onDestroy() {
  super.onDestroy();
  Log.d(TAG, "onDestroy...");
 }

我的面板构造函数:

 WhackEmPanel(Context c) {
  super(c); 
  this.context=c;
  loadAnimations();
  setCharacters();
  getHolder().addCallback(this);
  backGround = BitmapFactory.decodeResource(getResources(), R.drawable.background); 
  // create the game loop thread
  thread = new MainThread(getHolder(),this);  
  setFocusable(true);      
  //Generate Random Numbers for characters
  Picker = RandomPicker.RandomPick(8,500); //From 0 to 8, gives me 500 random integers
  picked=Picker.remove(0); 
 }

我是这个游戏编程的新手,但据我所知,我需要再次调用setFocusable(true),但在哪里?

编辑:在DizzyThermal的建议之后,我删除了暂停方法,只留下了日志,我不明白为什么它永远不会到达onResume()方法!

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。当按下主页按钮时,我的游戏循环线程仍然在运行,onStop从未被调用,我猜这个活动从未被正确停止过。现在我的onPause方法实际上完成了Thread执行,我遇到了Lunar Lander示例bug。

这个Blog通过向我的表面创建者添加以下代码帮助我解决了这个问题:

public void surfaceCreated(SurfaceHolder holder) {

  Log.d(TAG, "surfaceCreated");
 \\ <-- added fix
  if(thread.getState()== Thread.State.TERMINATED){
      thread = new MainThread(getHolder(),this); 
      thread.setRunning(true);
            thread.start();
 // <-- added fix
     }else {
  thread.setRunning(true);  //original code
  thread.start();           //original code
     }
 }

我的onPause方法现在实际上停止了游戏线程的执行。

 public void onPause(){
     super.onPause();
     panel.stopPLaying();
     Log.d(TAG,"onpause");      
 }

答案 1 :(得分:0)

不要将 onResume()方法保护,而是将其设为公开 ..

另外,尝试将super.onResume();移动到方法的顶部..我很确定它必须是“ Overriden ”函数中调用的第一个东西。