1

外部のアクティビティ(ブラウザ、ギャラリー、カメラ)にインテントを送信すると、システムがアクティビティを再現することがあります(いつ、なぜかはわかりません)。たとえば、私のアクティビティには次のボタンがあります。

button.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://google.com");
            startActivity(browserIntent);
        }
    });

ボタンを押してgoogle.comにアクセスし、戻ると-アクティビティが再作成されます(onCreateが呼び出されます-これがレクリエーションを検出する方法です)。一般的に、これは問題ありません。Androidは、メモリが不足している場合に、スタックの最上位にないアクティビティを閉じることができると聞きました。しかし、この動作に関連する問題があります。アクティビティが再作成されると、クラスフィールドの一部がnullになるため、アプリがクラッシュします。

このようなクラッシュを回避するためのベストプラクティスは何ですか?

4

2 に答える 2

1

あなたはあなたが使うことができるためにあなたのクラスフィールドのいくつかがnullになると言いました

@Override
protected void onSaveInstanceState(Bundle outState) {
    // SAVE YOUR DATA IN OUTSTATE BUNDLE
    outState.putBoolean("save value", value);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    value = savedInstanceState.getBoolean("save value");
    super.onRestoreInstanceState(savedInstanceState);
}

onsaveinstancestateは、一時停止時に値を保存します。onrestoreinstancestateは、アプリケーションがこのように再開したときに値を復元します。この方法で、値を保存または復元できます。

マニフェストで試すこともできる1つの選択肢...

android:configChanges = "orientation"

しかし、グーグルはそれがアンドロイド活動の自然な流れを壊すのでそれを推薦しませんでした。

于 2012-06-18T09:52:35.527 に答える
0

以下のようにfinish()メソッドを使用します。

button.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://google.com");
            startActivity(browserIntent);
            finish();
        }
    });
于 2012-06-18T09:46:46.963 に答える