【问题标题】:onCreate flow continues after finish()onCreate 流程在完成()之后继续
【发布时间】:2011-11-26 23:58:07
【问题描述】:

我想在onCreate 方法中完成一项活动。当我调用finish() 时,onDestroy() 不会立即被调用,代码一直流过finish()onDestroy() 直到 onCreate() 右括号之后才被调用。

根据 developer.android.com/reference 上的 onCreate() 描述。

你可以在这个函数中调用finish(),在这种情况下 onDestroy() 将立即被调用,没有任何其余的 活动生命周期(onStart()、onResume()、onPause() 等)正在执行。

我问的原因是:我想检查传递给 onCreate() 的 Bundle 中的数据。当然,我可以控制传递给 onCreate 的内容,但我仍然认为应该在交付时对其进行检查。

我的代码包含类A,它启动活动B。我相信最后两个“if 子句之外”标签不应该被调用,因为 if 语句中的 finish 方法应该已经破坏了活动。它与 if 子句无关,因为第二个 finish() 调用之后的标记行仍然被读取。

我的代码:

A类

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // goToBButton: when pressed sends message to class B.    
    Button goToBButton = (Button)this.findViewById(R.id.go_to__b_btn);
    goToBButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick (View v) {      
            Log.i(TAG,"A Class: goToBButton, onClick");
            Intent i = new Intent(A.this, B.class);
            startActivityForResult(i,REQ_TO_B);
        }       
    });                
} // end onCreate

我的代码类B

    public class B extends Activity{

private static final String TAG = "tag";

@Override
   public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);

  // set as true, should always print Tag: one line before first finish"
  if (true)  {

    Log.i(TAG,"B Class: one line before 1st finish");
    finish();
  }

  // shouldn't get here after first finish
  Log.i(TAG,"B Class: outside of if clause, before second finish");
  finish();
  // shouldn't get here after second finish
  Log.i(TAG,"B Class: outside of if clause, after finish");                  
   } // end onCreate


@Override
public void onStart () {
    super.onStart();
    Log.i(TAG,"B Class: onStart");
}

@Override
public void onRestart() {
    super.onRestart();
    Log.i(TAG,"B Class: onRestart");
}

@Override
public void onResume () {
    super.onResume();
    Log.i(TAG,"B Class: onResume");
}

@Override
public void onPause () {
    super.onPause();
    Log.i(TAG,"B Class: onPause");
}

@Override
public void onStop () {
    super.onStop();
    Log.i(TAG,"B Class: onStop");
}

@Override
public void onDestroy () {
    super.onDestroy();
    Log.i(TAG,"B Class: onDestroy");
}

 } // end B Class

这是我的标签结果:

11-26 15:53:40.456:INFO/tag(699):A 类:goToBButton、onClick

11-26 15:53:40.636:INFO/tag(699):A 类:onPause

11-26 15:53:40.865:INFO/tag(699):B 类:第一次完成前一行

11-26 15:53:40.896:INFO/tag(699):B 类:在 if 子句之外, 在第二次完成之前

11-26 15:53:40.917:INFO/tag(699):B 类:在 if 子句之外, 完成后

11-26 15:53:41.035:INFO/tag(699):A 类:onResume

11-26 15:53:41.165:INFO/tag(699):B 类:onDestroy

【问题讨论】:

  • “立即”在文档中是一个非常糟糕的词选择...

标签: android oncreate


【解决方案1】:

我猜这是因为 finish() 不会导致 onCreate 方法返回。您可以尝试简单地添加

finish();
return;

或者使用 if else

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);
  if(good data){
      //do stuff
  }else{
      finish();
  }
}

【讨论】:

  • 第一个“简单添加回报”的建议奏效了!返回后,继续调用 ClassA,然后调用 Class B onDestroy。
  • 简单加return;此后显示无法访问代码的错误。要绕过此操作,请使用 if 中的返回
【解决方案2】:

onCreate() 将控制权交还给系统之前,finish() 似乎不起作用。请参考这篇文章:about finish() in android。如果您不希望在调用完成后执行任何代码,则必须考虑此问题。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2019-11-01
    相关资源
    最近更新 更多