Androidでアクティビティを再起動する方法


381

Androidを再起動するにはどうすればよいActivityですか?私は次のことを試しましたが、Activity単に終了しました。

public static void restartActivity(Activity act){

        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        act.startActivity(intent);
        act.finish();

}

9
uが「act.finish();」を呼び出したため、アクティビティは終了しました。アクティビティ作成直後...
Nikhil Dinesh 2013年

1
古い方法
pedjjj 2017年

回答:


623

私は次のように私のテーマの切り替えを行いました:

Intent intent = getIntent();
finish();
startActivity(intent);

基本的に、私はfinish()最初に電話をかけ、このアクティビティが開始されたときとまったく同じインテントを使用しています。それはトリックをするようだ?

更新:以下のラルフによって指摘されActivity.recreate()ているように、API 11以降に進む方法です。これは、API11 +環境を使用している場合に適しています。API 10以下を使用している場合でも、現在のバージョンを確認して上記のコードスニペットを呼び出すことができます。(ラルフの回答に投票することを忘れないでください!)


36
そして、それは反対投票する価値がありますか?それはOPによって言及された要件ではありませんでした。実際には、それが望ましい場合があります。
EboMike、

9
まあ、アニメーションが気に入らない場合は、(回答で示したように)アニメーションをオフにすることができます。それは私の答え自体を間違っているわけではありません、それはあなたが自由に追加できるいくつかの追加のオプションを示していないだけです(そしてそれは質問で要求されませんでした)。
EboMike、

28
あなたはそれが間違っていると思います。反対投票は間違った/悪い回答を意味し、反対投票は回答が素晴らしいことを意味します。回答が他の回答とどれほど優れているかは、賛成票の数で示されます。あなたはあなたの答えを宣伝しようとしているのがわかりますが、その目的のためにシステムを誤用しています。
EboMike、

8
+1-これは私にとってはうまくいきました、そしてあなたが言うように、アニメーションは私が望んでいたものなので、ユーザーはそれが再起動していることを知っています。FWIW、私は質問への代替回答を提供するときに他のユーザーの回答に反対票を投じないことを原則としますが、私の回答が上回っている場合は賛成投票することがあります。
Michael Bray

4
EboMikeとBen:どちらのソリューションもOPの質問に答えました。純粋に「美的」理由のために誰かの答えに投票することは、まあ、素晴らしいことではありません。私はここStackoverflowで誰もそれをしないようにします...
ChuongPham 2013

368

APIレベル11(Honeycomb)以降、アクティビティのrecreate()メソッドを呼び出すことができます(この回答のおかげです)。

recreate()メソッドは構成変更と同じように機能するため、該当する場合はonSaveInstanceState()メソッドとonRestoreInstanceState()メソッドも呼び出されます。


3
前のアクティビティがstartActivityForResultを使用してこれを呼び出した場合はどうなりますか?
Android開発者

1
まあ、それはあなたがAPI 11より低いものをサポートする必要がないなら正しい答えです
エドワード・フォーク

@EdwardFalkは、サポートライブラリ上でそれを実行する関数がありますか?
Android開発者

2
これはすべての場合に機能するわけではありません。recreate()の呼び出し中にナビゲーションドロワーを開いている場合、再作成されても開いたままになります。つまり、状態が保存されるため、望ましくない場合があります。
Chapz

状態を保存したくないのは私です。場合によっては、クリーンな再起動が必要なだけの場合、EboMikeの回答を使用する必要があります。
Kimi Chiu

132

SDK 11より前は、これを行う方法は次のようになります。

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}

HTC Desireのアニメーションはまだ残っています(少なくともonConfigurationChangedメソッドで使用した場合)。これらは常に発生するわけではありませんが、EboMikeのコードを使用すると、常に発生するわけではありません。
Juozas Kontvainis、2011

8
これは、ランチャーによって開始されたメインアクティビティでは機能しません。インテントにいくつかのフラグが設定されているため、アクティビティは最終的に非表示になります。それ以外の場合はうまく動作します。
トーマスアーレ

いい視点ね。スタック内の基本アクティビティからfinish()を呼び出すので意味があります。
ベン

アクティビティのテーマを変更しているときにこれを呼び出すと、速度が向上するようです(アニメーションなし)
Ashok Goli

3
+1私はメインのアクティビティでさえうまく機能します。しかし、あなたが呼び出す必要がありますoverridePendingTransition(0, 0);finish()startActivity()あなたがそれを呼んだところ、それぞれ、ではない...
CAW

115

ラルフとベンの答えを組み合わせるだけです(コメントに加えられた変更を含む):

if (Build.VERSION.SDK_INT >= 11) {
    recreate();
} else {
    Intent intent = getIntent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);

    startActivity(intent);
    overridePendingTransition(0, 0);
}

8
すべてのベストアンサー。信じられないかもしれませんが、私はまだAPI 3デバイスをサポートしており、VERSION.SDK_INT値にはAPI 4が必要です。:)
Edward Falk

31

以前のAndroidバージョンをサポートしrecreate()、新しいAndroidバージョンで使用できるように、このコードを使用しました。

コード:

public static void restartActivity(Activity activity){
    if (Build.VERSION.SDK_INT >= 11) {
        activity.recreate();
    } else {
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
}

サンプル:

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Activity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActivity = MainActivity.this;

        Button button = (Button) findViewById(R.id.restart_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                restartActivity(mActivity);
            }
        });
    }

    public static void restartActivity(Activity activity) {
        if (Build.VERSION.SDK_INT >= 11) {
            activity.recreate();
        } else {
            activity.finish();
            activity.startActivity(activity.getIntent());
        }
    }
}

私にとって素晴らしい仕事です!!
papo

22

この解決策は私にとってうまくいきました。

最初にアクティビティを終了してから、もう一度開始してください。

サンプルコード:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}


19

このメソッドを呼び出す

private void restartFirstActivity()
 {
 Intent i = getApplicationContext().getPackageManager()
 .getLaunchIntentForPackage(getApplicationContext().getPackageName() );

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
 startActivity(i);
 }

おかげで、


1
OPは最初のアクティビティだけでなく、あらゆるアクティビティを再開したいと考えていますが、これは私にとって役に立ちました。
クリストファージョンソン

1
2つのフラグは知っておくと便利です。私の場合、これらのフラグなしでは何も起こらないようです。
オーウェンB

1
あなたのおかげでうまくいきました!神のお恵みがありますように 。
Vivek

16

これは何度も回答されていますが。

フラグメントからアクティビティを再開する場合は、次のようにします。

new Handler().post(new Runnable() {

         @Override
         public void run()
         {
            Intent intent = getActivity().getIntent();
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
            getActivity().overridePendingTransition(0, 0);
            getActivity().finish();

            getActivity().overridePendingTransition(0, 0);
            startActivity(intent);
        }
    });

これは少しやり過ぎだとお考えでしょうか?しかし、Handler投稿により、ライフサイクルメソッドでこれを呼び出すことができます。アプリに戻ってきたユーザー間で状態が変化したかどうかを確認するときに、onRestart/ onResumeメソッドでこれを使用しました。(インストール済み)。

なければHandlerあなたは奇妙な場所でそれを呼び出す場合はそれだけで活動を殺して、それを再起動しません。

ご質問はお気軽にどうぞ。

乾杯、クリス


2
ハンドラーの優れたソリューションと非常に優れた推論/説明。
JRomero

1
なぜ "overridePendingTransition"を2回呼び出すのですか?
Android開発者

1
@androiddeveloper思い出せません。バグの回避策だったと思います。startActivity()の前に一度呼び出すと、指示されたとおりに実行されます。
Chris.Jenkins、2014

これを私のonResume関数に実装した後、ゲームがonStopメソッドで停止し、黒い画面が表示されます...理由は不明
Scumble373

1
こんにちはクリス、これについてもう少し詳しく説明していただけますか。「ハンドラがなければ、奇妙な場所で呼び出すと、アクティビティが強制終了され、再起動されません。」?
parvez rafi 2017

15

まあこれはリストされていませんが、すでに投稿されているいくつかのコンボ:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

それは私のために動作します..感謝..しかし、私はあなたに尋ねたいです:なぜ私がコードの最初の部分(SDK_INTをチェックするもの)を削除するとき、私のアプリケーションは比較的遅いですか?..もう一度コードを再アタッチすると、コードは比較的高速に実行されます。
マクラン2013年

2
よくわかりません。まあ、11以上のSDKを使用している場合、recreate()はインテントを取得し、終了してから再起動するよりも高速です。onStopまで実行されるコードを終了して、方向変更などの実行コードを再作成します...したがって、実行することはそれほど多くありません。
コード化

4

Cameraの奇妙なSurfaceViewライフサイクル動作と組み合わせて。recreate()は、SurfaceViewsのライフサイクルではうまく動作しないことがわかりました。surfaceDestroyedは、レクリエーションサイクル中に呼び出されることはありません。これはonResume(奇妙な)の後に呼び出され、その時点で、SurfaceViewが破棄されます。

アクティビティを再作成する元の方法は正常に機能します。

Intent intent = getIntent();
finish();
startActivity(intent);

これがなぜなのか正確にはわかりませんが、SurfaceViewsで発生していた問題を解決したので、将来的に他の人を導くことができる観察結果にすぎません


4

なぜ誰もIntent.makeRestartActivityTask()がこの正確な目的を明確にすることについて言及しなかったのはなぜでしょうか。

*アプリケーションのタスクを基本状態で再起動するために使用できるインテントを作成します。

startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent()));

このメソッドはIntent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK、デフォルトのフラグとして設定します。


3

実際、次のコードはAPIレベル5以上で有効であるため、ターゲットAPIがこれよりも低い場合、EboMikeのコードと非常によく似たものになります。

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);

3

メインのアクティビティを含め、あらゆるアクティビティで機能するハック方法が1つあります。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

向きが変わると、Androidは通常、アクティビティを再作成します(オーバーライドしない限り)。このメソッドは、Androidがアクティビティを再作成しない場合に、180度の回転に役立ちます。


3
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

これを使ってみて..


3

あなたの質問に対する解決策は:

public static void restartActivity(Activity act){
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    ((Activity)act).startActivity(intent);
    ((Activity)act).finish();
}

新しいアクティビティを開始したり、現在のアクティビティを終了したりするには、アクティビティコンテキストにキャストする必要があります。

これが役に立てば幸いです。


1

最後の行を削除すると、新しいactアクティビティが作成されますが、古いインスタンスは引き続き有効です。

方向が変更されたとき(つまり、状態が保存されてに渡されたときonCreate(Bundle))にアクティビティを再起動する必要がありますか?

そうでない場合、考えられる回避策の1つは、最初のアクティビティから開始される1つの追加のダミーアクティビティを使用することと、そのジョブの新しいインスタンスを開始することです。またはact.finish()、新しい呼び出しが開始された後、への呼び出しを遅らせます。

ほとんどの状態を保存する必要がある場合は、かなり深い水域に入っています。状態のすべてのプロパティを渡すことは、特に新しいインスタンスに渡すことにより、古いコンテキスト/アクティビティをリークすることなく、簡単ではないためです。

何をしようとしているかを指定してください。


1
アプリにさまざまなテーマを適用するボタンがあります。テーマが適用された後、優先的に保存され、ルートアクティビティが再起動し、優先からテーマを読み取り、onCreate()でテーマを適用します。アクティビティがsingle_instanceでない場合、上記のコードは正常に機能することがわかります。それがベストプラクティスかどうかはわかりません。

現在、AFAIKのアクティビティを再起動するための、SDKで公開されたクリーンな方法はありません。何もリークしない場合は、行ってもかまいません:)
Dimitar Dimitrov

0

これが私のやり方です。

        val i = Intent(context!!, MainActivity::class.java)
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(i)

-1

フラグメントから呼び出す場合は、以下のコードを実行してください。

Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);

-4

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

onRestart()

以下の方法

 @Override
    protected void onRestart() {
        super.onRestart();
        setContentView(R.layout.add_entry);
    }

現在のアクティビティを再開したい場所でonRestart()呼び出します


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