web-dev-qa-db-ja.com

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

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

public static void restartActivity(Activity act){

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

}
349
user157195

私はこのように私のテーマスイッチャーをしました:

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

基本的に、私は最初にfinish()を呼び出しています、そして私はこの活動が始められたのと全く同じ意図を使っています。それはトリックをしているようですか?

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

588
EboMike

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

Recreate()メソッドは構成の変更とまったく同じように機能するため、必要に応じてonSaveInstanceState()メソッドとonRestoreInstanceState()メソッドも呼び出されます。

346
Ralf

SDK 11以前は、これを行う方法は次のとおりです。

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

RalfとBenの答え(コメントに加えられた変更を含む)を組み合わせるために:

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);
}
109
JustinMorris

私はまだ古いAndroidのバージョンをサポートし、新しいAndroidのバージョンでrecreate()を使うことができるように私はこのコードを使いました。

コード:

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());
        }
    }
}
22
Thomas Vos

この解決策は私のために働いた。

最初にアクティビティを終了してから再開します。

サンプルコード

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

これは現在のアクティビティを再開する最も簡単な方法です。

finish();
startActivity(getIntent());
18
Abhishek Soni

このメソッドを呼び出す

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

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

ありがとう、

17
Nikhil Dinesh

たとえこれが複数回答えられたとしても。

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

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がなければ、奇妙な場所でそれを呼び出した場合、それは単にアクティビティを終了させ、それを再開することはありません。

質問があればお気軽にどうぞ。

乾杯、クリス

16
Chris.Jenkins

これはリストされていませんが、すでに投稿されているもののコンボです。

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}
15
Codeversed
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

これを使ってみてください。

3
Amsheer

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

アクティビティを再作成する元々の方法はうまくいきます。

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

これがなぜなのか正確に理解することはできませんが、SurfaceViewsで私が抱えていた問題を解決したので、将来他の人を導くことができるのは単なる観察です

3
The4thIceman

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

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

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

これが役立つことを願っています。そして私のために働く。

3
Rajesh Peram

主な方法を含め、あらゆる活動に取り組むべき1つの厄介な方法があります。

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

向きが変わると、Androidは通常あなたのアクティビティを再作成します(あなたがそれを上書きしない限り)。この方法は、Androidがあなたの活動を再現しないときの180度回転に便利です。

3
Achal Dave

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

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

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

あなたは向きが変更されたときのようにアクティビティを再起動する必要がありますか(すなわちあなたの状態は保存されonCreate(Bundle)に渡されます)?

そうでない場合、考えられる1つの回避策は、最初のActivityから開始される1つの余分なダミーActivityを使用することです。どのジョブがその新しいインスタンスを開始することになります。あるいは、新しいものが開始された後に、単にact.finish()への呼び出しを遅らせるだけです。

あなたが状態の大部分を保存する必要があるなら、あなたはかなり深い水に入っています、それは新しいインスタンスにそれを渡すことによって、特にあなたの古いContext/Activityを漏らさずにあなたの状態のすべてのプロパティを渡すことは自明ではないので。

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

1

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

onRestart()

以下の方法

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

そしてonRestart()を呼び出して、現在のアクティビティを再開します。

0
SuKu

この目的を明確にしているIntent.makeRestartActivityTask()について誰も言及していないのはなぜだろうか。

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

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

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

0
shkschneider