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 が呼び出されるたびに実行されます。なんで?

上記のコードを JS に変換すると (同様)、if ブロックは 1 回だけ評価されます。

4

4 に答える 4

3

alertBoxクラスのメンバー変数です。つまり、クラスの各インスタンスには独自のコピーがあります。ActivityAしたがって、それぞれのインスタンスが複数ある場合は、すべてが最初alertBoxに設定されています。null

共有したい場合は、次alertBoxのように宣言する必要がありますstatic

private static AlertDialog alertBox;

ただし、これによりマルチスレッド アプリケーションで (追加の) 問題が発生する可能性があるため、注意して使用してください。

于 2013-01-15T12:29:00.987 に答える
1

アプリケーションが Android アクティビティのライフサイクルにどのように準拠しているかを確認する必要があります。onCreate メソッドは、Activity が再度作成されるたびに (以前に存在していた場合でも) 呼び出されます。onDestroy()メソッドが呼び出されるかどうかを確認します。答えが「はい」の場合、Android がそのアクティビティをどのように処理するかがわかります。詳細な説明については、http://developer.android.com/training/basics/activity-lifecycle/starting.htmlを参照してください。

ただし、答えが「いいえ」の場合は、アクティビティの処理に何か問題があります。ユーザーがボタンなどを押すたびに同じアクティビティを再作成するかもしれませんfinish()。しかし、これはただの推測です。

于 2013-01-15T12:57:29.640 に答える
0

おそらく、アクティビティが破棄されて再作成されるため、新しいオブジェクトの alertBox は null になります。

alertBox はそれが作成されたアクティビティへの参照を保持しているため (アクティビティの他のインスタンスでも正しく機能するかどうかはわかりません)、静的変数に変更しないください。変数を使用すると、元のアクティビティが GC (ガベージ コレクター) によって収集されなくなります。

アクティビティの各インスタンスで新しいものを作成するのが正しい方法です (現在行っている方法で問題ありません)。

于 2013-01-15T12:44:44.783 に答える
0

alertBoxインスタンス変数として宣言されています。

すべてのオブジェクトインスタンスではなく、クラスに対して一度だけ設定したい場合はalertBox、変数を作成する必要があります。static

于 2013-01-15T12:28:58.050 に答える