最初に、アクティビティはインテントによって起動され、このインテントで何かが実行されます。
アクティビティの向きを変更すると、アクティビティが再度再読み込みされ、インテントがアクティビティに渡されます。
アクティビティが再び使用するのを防ぐために、そのインテントをクリアするにはどうすればよいですか?
setIntent(null)
を試しましたが、結果がありません。
私も同様の問題を抱えていました。これは私を助けました。たぶん、onSaveInstanceState(Bundle outState)を使用して、バンドルにデータを追加し、inStateがnullにならないようにする必要があるかもしれません。
Intent activityIntent = null; // Subsequent times it's null
@Override
protected void onCreate(Bundle inState) {
super.onCreate(inState);
.
.
if (inState!=null) {
/*Recreating activity with a saved state*/
} else {
/*Creating activity*/
activityIntent = getIntent(); // First time through intent is used
/*Get your Extra Intent data here. You will be capturing data on 1st creation. */
}
setIntent(null)
は使用しないでください。時々はうまくいくかもしれませんが、状況によっては元の意図が戻ってくるかもしれません。
代わりに、アクション、データ、またはsetIntent()
などの追加機能を含まない単純なインテントでnew Intent(Context, Class)
を呼び出します。
実際、setIntent()
の使用は、そもそもAPI設計の適切な決定ではありませんでした。代わりに、dcgが指摘したように、savedInstanceState
がまだnullである場合にのみ、最初にインテントをチェックするようにしてください。
インテントがアクション(setActionを使用)とともにアクティビティに送信される場合は、インテントを受け取ったときに次の手順を実行して、画面が回転するときにこのインテントが複数回処理されないようにします。
Intent i = getIntent();
i.setAction(null);
setIntent(i);
インテントアクションを設定した場合は、getIntent().setAction("");
でクリアできます。
たとえば、onCreate(...)
の場合:
...
String action = getIntent().getAction();
if (action != null) {
if (action.equals(YOUR_ACTION_WHATEVER)) {
doSomethingHere(); // do something here
getIntent().setAction(""); // clear the action
}
}
...
これによりアクションがクリアされます。それ以外の場合は、デバイスを回転させるたびに呼び出されます。
解析後にインテントエクストラとインテントエクストラを手動でクリアした後でも、Activity.getIntent()は常にアクティビティを開始した元のインテントを返すように見えます。
これを回避するには、次のようなものをお勧めします:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The Intent provided by getIntent() (and its extras) will persist through a restore
// via savedInstance. Because of this, restoring this activity from a
// an instance that was originally started with extras (deep-link or
// pre-defined destination) may cause un-desired behavior
// (ie...infinite loop of sending the user directly to somewhere else because of a
// pre-defined alternate destination in the Intent's extras).
//
// To get around this, if restoring from savedInstanceState, we explicitly
// set a new Intent *** to override the original Intent that started the activity.***
// Note...it is still possible to re-use the original Intent values...simply
// set them in the savedInstanceState Bundle in onSavedInstanceState.
if (savedInstanceState != null) {
// Place savedInstanceState Bundle as the Intent "extras"
setIntent(new Intent().putExtras(savedInstanceState));
}
processIntent(getIntent())
}
private void processIntent(Intent intent) {
if (getIntent().getExtras() == null) {
// Protection condition
return;
}
doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST"));
final String somethingIDontWantToPersist =
intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST");
if(somethingIDontWantToPersist != null) {
doSomething(somethingIDontWantToPersist);
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save selective extras from original Intent...
savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued");
super.onSaveInstanceState(savedInstanceState);
}
このように、元のインテント/インテントエクストラの特定の部分を明示的に保持する機能を保持しながら、元のインテントをダンプするメカニズムがあります。
すべてのアクティビティ起動モードをテストしたわけではないことに注意してください。
intent.putExtra(YourKey,""); //reset the value to knknown setIntent(intent);
私の提案は、これをブール変数で切り替えて、アクティビティが最初に作成されたかどうかを確認することです。
それ以外の場合は、onCreateメソッドを確認できます。これは、アクティビティが最初に作成されたときにのみ実行されます。
私の場合、データをnullに設定する必要がありました。
getIntent().setData(null);