【问题标题】:Losing focus on SurfaceView after Home button is pressed按下主页按钮后失去对 SurfaceView 的关注
【发布时间】:2012-02-12 18:26:27
【问题描述】:

我正在开发基于此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 的建议之后,我删除了 pause 方法,只留下日志,我不明白为什么它永远不会到达 onResume() 方法!

【问题讨论】:

    标签: android surfaceview android-activity


    【解决方案1】:

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

    这个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");      
     }
    

    【讨论】:

      【解决方案2】:

      不要将 onResume() 方法设为 protected,而是将其设为 public..

      另外,尝试将super.onResume(); 移动到方法的顶部。我很确定它需要成为“Overriden”函数中调用的第一件事。.

      【讨论】:

      • 不.. 它没有帮助。它仍然没有达到 onResume 或任何其他 Overriden 方法。我已经编辑了我对代码方式的答案。
      • 你在super.onResume();之前还有panel.pauseGame(false); 当Home被点击时Android Activity生命周期应该达到onPause()(可能更远,取决于你在返回之前等待多长时间)并且当它被带回来时它必须通过 onResume() 继续运行。包含 super.onResume() 以使该方法执行它通常会执行的操作。如果您不覆盖它,这就是它会执行的操作。这就是为什么它通常被列为首先要做的事情..
      • 它仍然没有改变任何东西,无论有没有pauseGame,日志仍然没有给我onResume,onRestart,onStart,什么都没有。在我按回家后回来后,没有调用任何方法。我不明白为什么。
      猜你喜欢
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多