Androidでのリロードアクティビティ


220

リロードすることをお勧めしActivityAndroidの

それを行う最善の方法は何でしょうか?this.finishそしてthis.startActivity活動とはIntent


3
私は経験豊富なAndroid開発者ではありませんが、アクティビティの再起動はデザインが悪いように聞こえ、極端な場合にのみ実行する必要があります。
ハドソン

@Hudson構成の変更で何が起こるかです。それが良いデザインであるかどうかは、まったく別の議論です。;)
hpique 2013年

1
@ハドソンあなたは今、5年の経験開発者です:D
Pratik Butani

@PratikButani、私はあなたを知っていますか?:)私は今8年ほどの経験がありますが、Android開発ではあまりありません。
ハドソン

あなたは私のプロフィールを訪問しました:P @Hudson
Pratik Butani

回答:


521

あなたは単に使うことができます

finish();
startActivity(getIntent());

Activity内からを更新します。


2
アクティビティクラス内で呼び出すことができない場合はどうですか?コンテキスト参照でそれを行う方法はありますか?
ジョルジリン2012年

1
@giorgiline-はい、アクティビティクラス内で定義するインターフェースを作成し、そのインターフェースをパラメーターとして、使用している外部クラスに渡します。
aggregate116​​6877

1
うわー、こんなに簡単だとは思いませんでした。
theblang 2013

1
結果のために開始されたアクティビティにどのように対処できますか?元の発信者がまだ結果を受け取っている状態でそれを再開できますか?
tothphu 2014年

1
@tothphu-試したことはないが、理論的にはそうだと思う。ただし、アクティビティが2回終了すると、最初に作成したアクティビティに結果が返されません。
2014年

64

recreate()メソッドの後に点滅するのを見たくない人は、単に

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
驚くばかり!ユーザーが気付かないように、トランジションをオーバーライドしたかったのです。
セディムホザ2017

よくやった!ユーザーはリロードにほとんど気付かないでしょう。
サム

38

これは、プリファレンスの変更からの復帰を変更した後にアクティビティをリロードするために行うことです。

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

これにより、本質的にアクティビティーがそれ自体を再描画します。

更新: これを行うためのより良い方法は、recreate()メソッドを呼び出すことです。これにより、アクティビティが再作成されます。


15
それはうまくいくかもしれませんが、ライフサイクルメソッドを明示的に呼び出すことは強く推奨されません。
ITisha 14

この方法を使用する場合は、onCreate()を呼び出す代わりに、すべてを設定してonCreate()およびonResume()内からそれを呼び出す個別のinit()メソッドを使用する必要があります。
トム

1
ライフサイクルメソッドが他のものに使用されている状況では機能しない場合を除いて、優れたソリューションです。たとえば、電話のカメラにアクセスしていて、写真が撮られると、画面が私のアクティビティに戻ってビューに投稿します。ライフサイクルメソッドを使用して更新すると、カメラプロセスから追い出され、写真がアクティビティに戻らず、最初からアクティビティを取得します。注意すべき一例にすぎません。
Azurespot 2015年

1
recreate()を使用するときは、アクティビティのlaunchModeを考慮することが重要です。たとえば、launchMode = singleTopのアクティビティでrecreate()を呼び出すと、後でonCreate()が呼び出されるのがわかりません。OTOH、recreate()を呼び出す代わりに、finish()を明示的に呼び出してからstartActivity()を呼び出すと、後でonCreate()が呼び出されるのがわかります。
albert cブラウン2016年

14

Intentを使用してアクティビティをリロードするために与えられた以前の回答を見ました。これらは機能しますが、Activityクラス自体に指定されているrecreate()メソッドを使用して同じことを行うこともできます。

これを書く代わりに

//ダイアログボックスを閉じたときにメインアクティビティを更新します

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

これはこれだけを書くことによって行うことができます

recreate();

recreate()私の解決策でした-「StartActivityForResult」を使用してアクティビティを開始すると動作が壊れたため、アクティビティを「再開」しても機能しませんでした。
KYL3R


10

急いで自分のアプリケーションの1つでメッセージリストを更新する必要があったので、現在のダイアログを閉じる前にメインのUIアクティビティの更新を実行しました。これを実行するためのより良い方法があると確信しています。

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

Androidには、アクティビティの作成と破棄を処理するプロセス管理システムが含まれており、手動でアクティビティを再開することで得られるメリットはほとんどありません。詳細については、Application Fundamentalsをご覧ください。

ただし、onPauseメソッドとonStopメソッドが保持する必要のないリソースを確実に解放し、onLowMemoryを使用してアクティビティの必要性を最小限に抑えることをお勧めします。


2
onLowMemoryについて言及する場合は+1。そのような方法が存在することを知りませんでした!
hpique 2010

4

同じ目的で開始し、activityを閉じますactivity

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

場合によっては、それが他の場合のベストプラクティスである場合、次のように使用することを選択した場合、コンテキスト駆動型であることはお勧めできません。アクティビティから息子に渡す最良の方法です。

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

問題は、activityIWishToRunからfinish()を実行するたびに、実際のアクティビティに戻ります


1
これは多分古いですが、あなたは私に多くの時間を節約してくれました!:)
リオ・イルス

4

アクティビティ全体をリロードするのは大変な作業になる場合があります。更新する必要があるコードの部分を(kotlin)に配置するだけです:

override fun onResume() {
    super.onResume()
    //here...
}

Java:

@Override
public void onResume(){
    super.onResume();
    //here...

}

また、必要に応じて「onResume()」を呼び出します。


2

それは良い考えではないと思います...よりクリーンなメソッドを実装する方が良いでしょう。たとえば、アクティビティがフォームを保持している場合、クリーナーメソッドはフォーム内の各ウィジェットをクリアし、すべての一時データを削除します。それはあなたが望むことだと思います:アクティビティを初期状態に復元します。


実際、アプリケーションの状態を変更してから、アクティビティをリロードして変更を反映させたいと思います。
hpique

あなたの場合の「アプリケーションの状態」は何ですか?環境設定?
Zehrer

2

これをしばらく試してみたところ、アクティビティを再開したことによる予期しない結果は見つかりませんでした。また、これはAndroidがデフォルトで向きを変更したときに行う動作と非常に似ていると思います。そのため、同じような状況でそれを行わない理由はわかりません。


逆に、アクティビティを再起動して画面を「更新」しようとしました。それは表面に表示されません何か問題がありました、私の情報は私が望む方法を更新しました、LogCatは別の話を伝えます。LogCatで、アクティビティのonCreateメソッドに戻り、設定を取得しようとします。1回目の試行でnullポインタ例外を受け取り、次にonCreateでの開始を再度試み、2回目はstoredPrefを受け取ります。ここで何が起こっているのかはわかりませんが、WYSIWIGは私には当てはまらなかったため、単に結果を見ていないことを確認したかっただけです。
taraloca

どのくらい正確に活動を再開しますか?
hpique

2

私は同じ問題を抱えています

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

このコードは私のために働きます。Android API 17


2

アクティビティでは、アクティビティrecreate()を「再作成」するために呼び出すことができます(API 11+)


1

設定:私のような別のアプローチだったlaunchModeに私の活動のをsingleTopして呼び出すことなくfinish()、ただstartActivity(getIntent())仕事をするの。との両方で新しいデータに注意する必要がonCreate()ありonNewIntentます。Sushの方法では、アプリケーションはAMAN SINGHが言ったように点滅する可能性があります。しかし、AMAN SINGHのアプローチは、彼が「瞬き」問題を修正したとしても、どういうわけか、不必要である新しいアクティビティを作成します。

この質問には遅すぎますが、誰かが解決策を探しているなら、ここにあります。




0

私にとってそれは機能していますが、別のインテントを作成せず、同じインテントに新しいデータをロードします。

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.