2
/**
 * Example Activity to demonstrate the lifecycle callback methods.
 */
public class ActivityA extends Activity {

    private String mActivityName;
    private TextView mStatusView;
    private TextView mStatusAllView;
    private StatusTracker mStatusTracker = StatusTracker.getInstance();
    private AlertDialog alertBox;
    private static int number = 0;

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

        init();

        String output = getString(R.string.on_create) + number++;
        showAlertDialog(alertBox, output);
        mStatusTracker.setStatus(mActivityName, output);
        Utils.printStatus(mStatusView, mStatusAllView);
    }

    @Override
    protected void onStart() {
        super.onStart();
        mStatusTracker.setStatus(mActivityName, getString(R.string.on_start));
        Utils.printStatus(mStatusView, mStatusAllView);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        mStatusTracker.setStatus(mActivityName, getString(R.string.on_restart));
        Utils.printStatus(mStatusView, mStatusAllView);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mStatusTracker.setStatus(mActivityName, getString(R.string.on_resume));
        Utils.printStatus(mStatusView, mStatusAllView);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mStatusTracker.setStatus(mActivityName, getString(R.string.on_pause));
        Utils.printStatus(mStatusView, mStatusAllView);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mStatusTracker.setStatus(mActivityName, getString(R.string.on_stop));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mStatusTracker.setStatus(mActivityName, getString(R.string.on_destroy));
        mStatusTracker.clear();
    }

    public void startDialog(View v) {
        Intent intent = new Intent(ActivityA.this, DialogActivity.class);
        startActivity(intent);
    }

    public void startActivityB(View v) {
        Intent intent = new Intent(ActivityA.this, ActivityB.class);
        startActivity(intent);
    }

    public void startActivityC(View v) {
        Intent intent = new Intent(ActivityA.this, ActivityC.class);
        startActivity(intent);
    }

    public void finishActivityA(View v) {
        ActivityA.this.finish();
    }

    private void showAlertDialog(AlertDialog ad, String msg) {
        ad.setTitle("Logging Msg");
        ad.setMessage(msg);
        ad.show();
    }

    private void init() {
        System.out.println("Value = before &&&&&&&&& " + alertBox);
        if (alertBox == null) { // Why always null?
            alertBox = new AlertDialog.Builder(this).create();
            mActivityName = getString(R.string.activity_a);
            mStatusView = (TextView) findViewById(R.id.status_view_a);
            mStatusAllView = (TextView) findViewById(R.id.status_view_all_a);
            Log.e("ActivityA", "Init done **************************************");
            Log.e("ActivityA", "Init done **************************************");
            System.out.println("Value = after &&&&&&&&&&& " + alertBox);
        }
    }
}

只有第一次调用 init 时,我设置了 alertBox 并且我认为 if 块不应该在任何其他时间执行。但我错了,每次调用 init 时它都会运行。为什么?

我来自 Javascript,如果我将上面的代码翻译成 JS(类似),if 块只评估一次。

4

4 回答 4

3

alertBox是类的成员变量,即类的每个实例都有自己的副本。因此,如果您有多个实例,ActivityA每个实例都有自己的alertBox全部设置为null最初。

如果要共享alertBox,则需要将其声明为static

private static AlertDialog alertBox;

虽然,这可能会在多线程应用程序中导致(额外的)问题,所以请小心使用!

于 2013-01-15T12:29:00.987 回答
1

您应该检查您的应用程序如何遵循 android 活动生命周期。每次再次创建 Activity 时都会调用 onCreate 方法(即使它之前存在)。检查您的onDestroy()方法是否被调用。如果答案是肯定的,那么您现在知道 android 是如何处理它的 Activity 的了。有关详细说明,请参阅http://developer.android.com/training/basics/activity-lifecycle/starting.html

但是,如果答案是否定的,则您的活动处理有问题。也许您每次用户按下按钮时都重新创建相同的活动等。也许您finish()在某处进行活动。但这只是疯狂的猜测。

于 2013-01-15T12:57:29.640 回答
0

alertBox被声明为实例变量。

如果您只想为类而不是为每个对象实例设置一次,也许您应该创建alertBox一个变量。static

于 2013-01-15T12:28:58.050 回答
0

活动可能被销毁并重新创建,因此新对象的 alertBox 为 null。

您不应该其更改为静态变量,因为 alertBox 包含对创建它的活动的引用(我不确定它是否甚至可以在活动的其他实例中正常工作),所以如果您将其保存在静态变量,它将阻止原始活动被 GC(垃圾收集器)收集。

在活动的每个实例中创建一个新的活动是正确的方式(你现在这样做的方式很好)。

于 2013-01-15T12:44:44.783 回答