1

PictureList と AddPictures の 2 つのアクティビティがあります。アクティビティ PictureList から、次のような結果のアクティビティをリクエストしています。

Intent myIntent = new Intent(PictureList.this, AddPictures.class);
Bundle b = new Bundle();
b.putInt("iEntry", clickCounter);
b.putBoolean("bAddPicture", true);
b.putBoolean("bEditPicture", false);
myIntent.putExtras(b);
startActivityForResult(myIntent,1);

対応する onActivityResult もここで実装しています。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (requestCode == 1) {
         if(resultCode == RESULT_OK){        
             iReturnedEntry = data.getIntExtra("iReturnedEntry", 0);
         }
         if (resultCode == RESULT_CANCELED) {    
         }
      }
    }
}

もう 1 つのアクティビティである AddPictures では、次のパラメーターを受け取ります。

Bundle b = getIntent().getExtras();
iEntry = b.getInt("iEntry");
bAddPicture = b.getBoolean("bAddPicture", false);
bEditPicture = b.getBoolean("bEditPicture", false);

返さなければならないときは、次のようにします。

Intent returnIntent = new Intent();
returnIntent.putExtra("iReturnedEntry", iEntry);
setResult(RESULT_OK,returnIntent);     

通常、アプリケーションは正常に動作しますが、結果が保存されないことがよくあります。何らかのメモリ管理またはその他の理由により、PictureList アクティビティが再作成されているか、アクティビティ AddPictures から戻った後に onCreate メソッドが再度呼び出されているため、onActivityResult が機能していないと思います。この問題を解決するにはどうすればよいですか?

4

3 に答える 3

1

別のアクティビティからの結果を待っている場合は、パラメータを共有設定として保存し、onResume 中に前のアクティビティにロードし直すのが最善の方法です。このようにして、onActivityResult を含むアクティビティの再作成によってデータが失われることはありません。

次に、最初のアクティビティ PictureList のコードを次のように変更します。

bPictureRequested = true;
bPictureReceived = false;
appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
preferencesEditor = appSharedPreferences.edit();
preferencesEditor.putBoolean("bPictureReceived", bPictureReceived);
preferencesEditor.commit();

Intent myIntent = new Intent(PictureList.this, AddPictures.class);
Bundle b = new Bundle();
b.putInt("iEntry", clickCounter);
b.putBoolean("bAddPicture", true);
b.putBoolean("bEditPicture", false);
myIntent.putExtras(b);
startActivity(myIntent);

結果を取得するために、onResume に次の行を追加しました。

if(bPictureRequested){
        appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        bPictureReceived = appSharedPreferences.getBoolean("bPictureReceived", false);
        if(bPictureReceived){
                iReturnedEntry = appSharedPreferences.getInt("iReturnedEntry", 0);
                // Reset the flags
                bPictureRequested = false;
                bPictureReceived = false;
                preferencesEditor = appSharedPreferences.edit();
                preferencesEditor.putBoolean("bPictureReceived", bPictureReceived);
                preferencesEditor.commit();
        }
}

ここで、もう 1 つのアクティビティ AddPictures について、前のパラメーターを値で取得する同じ部分を残しましたが、共有設定を使用してデータを返す方法を変更しました。

appSharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
preferencesEditor = appSharedPreferences.edit();
preferencesEditor.putBoolean("bPictureReceived", true);
preferencesEditor.putInt("iReturnedEntry", iEntry);
preferencesEditor.commit();
finish();

現在、すべてが正常に機能しています。

于 2013-05-30T21:58:45.407 に答える
0

はい、アクティビティは Android によって再作成される可能性があります。これは通常、アクティビティが中断されている間にメモリが必要だったためです。

ここでアクティビティのライフサイクルを読み、onPause() および onResume() メソッドを使用して、アクティビティが一時停止および再開されるときに、PictureList アクティビティの状態を保存および復元します。

FWIW 同じことがフラグメントにも当てはまりますが、フラグメントがさらに頻繁に作成および破棄される点が異なります (たとえば、横向きと縦向きの間でデバイスを回転させた場合)。アクティビティとフラグメントのライフサイクルを理解し、正しく操作することは、適切に動作するアプリケーションを作成するために不可欠です。

于 2013-05-30T13:42:20.547 に答える
0

たとえば、スマートフォンが縦向きから横向きモードに切り替わると、アクティビティが破棄されて再作成されます。データをバックアップする必要があるか、データがリセットされます。

AddPictures クラスの場合、Activity の onSaveInstanceState(Bundle outState) メソッドでデータを保存し、onCreate() メソッドで取得します。アクティビティが再作成された場合、これらのメソッドはデータを復元します。

例:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("iReturnedEntry", iEntry);
    }

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            String dataSaved = savedInstanceState.getString("iReturnedEntry");
            Log.v("HelloWorldActivity", "iReturnedEntry=" + dataSaved);
        }

    }
于 2013-05-30T13:46:01.817 に答える