AndroidのActivity
を再起動するにはどうすればよいですか?私は以下を試しましたが、Activity
は単に終了します。
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
act.startActivity(intent);
act.finish();
}
私はこのように私のテーマスイッチャーをしました:
Intent intent = getIntent();
finish();
startActivity(intent);
基本的に、私は最初にfinish()
を呼び出しています、そして私はこの活動が始められたのと全く同じ意図を使っています。それはトリックをしているようですか?
更新:下記のRalfが指摘しているように、 Activity.recreate()
はAPI 11以降で使用する方法です。あなたがAPI11 +環境にいるなら、これは好ましいです。 API 10以下の場合は、現在のバージョンを確認して上記のコードスニペットを呼び出すことができます。 (ラルフの答えを支持することを忘れないでください!)
APIレベル11(ハニカム)以降、アクティビティの recreate() メソッドを呼び出すことができます(おかげで 答え)。
Recreate()メソッドは構成の変更とまったく同じように機能するため、必要に応じてonSaveInstanceState()メソッドとonRestoreInstanceState()メソッドも呼び出されます。
SDK 11以前は、これを行う方法は次のとおりです。
public void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
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);
}
私はまだ古い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());
}
}
}
この解決策は私のために働いた。
最初にアクティビティを終了してから再開します。
サンプルコード
public void restartActivity(){
Intent mIntent = getIntent();
finish();
startActivity(mIntent);
}
これは現在のアクティビティを再開する最も簡単な方法です。
finish();
startActivity(getIntent());
このメソッドを呼び出す
private void restartFirstActivity()
{
Intent i = getApplicationContext().getPackageManager()
.getLaunchIntentForPackage(getApplicationContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
startActivity(i);
}
ありがとう、
たとえこれが複数回答えられたとしても。
フラグメントからアクティビティを再開する場合は、次のようにします。
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
がなければ、奇妙な場所でそれを呼び出した場合、それは単にアクティビティを終了させ、それを再開することはありません。
質問があればお気軽にどうぞ。
乾杯、クリス
これはリストされていませんが、すでに投稿されているもののコンボです。
if (Build.VERSION.SDK_INT >= 11) {
recreate();
} else {
Intent intent = getIntent();
finish();
startActivity(intent);
}
public void onRestart() {
super.onRestart();
Intent intent=new Intent();
intent.setClass(act, act.getClass());
finish();
act.startActivity(intent);
}
これを使ってみてください。
カメラとの奇妙なSurfaceViewライフサイクルの振る舞い と組み合わせて。 recreate()がSurfaceViewのライフサイクルとうまく動作しないことがわかりました。 surfaceDestroyedはレクリエーションサイクル中に呼び出されることはありません。 onResume(奇妙)の後に呼び出され、その時点で私のSurfaceViewは破壊されます。
アクティビティを再作成する元々の方法はうまくいきます。
Intent intent = getIntent();
finish();
startActivity(intent);
これがなぜなのか正確に理解することはできませんが、SurfaceViewsで私が抱えていた問題を解決したので、将来他の人を導くことができるのは単なる観察です
あなたの質問に対する解決策は:
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
((Activity)act).startActivity(intent);
((Activity)act).finish();
}
新しいアクティビティを開始し、現在のアクティビティを終了するには、アクティビティコンテキストにキャストする必要があります。
これが役立つことを願っています。そして私のために働く。
主な方法を含め、あらゆる活動に取り組むべき1つの厄介な方法があります。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
向きが変わると、Androidは通常あなたのアクティビティを再作成します(あなたがそれを上書きしない限り)。この方法は、Androidがあなたの活動を再現しないときの180度回転に便利です。
実際には、次のコードはAPIレベル5以上で有効です。したがって、ターゲットAPIがこれより低い場合は、EboMikeのコードと非常によく似たものになります。
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);
最後の行を削除すると、新しいact
アクティビティが作成されますが、古いインスタンスはまだ生きています。
あなたは向きが変更されたときのようにアクティビティを再起動する必要がありますか(すなわちあなたの状態は保存されonCreate(Bundle)
に渡されます)?
そうでない場合、考えられる1つの回避策は、最初のActivityから開始される1つの余分なダミーActivityを使用することです。どのジョブがその新しいインスタンスを開始することになります。あるいは、新しいものが開始された後に、単にact.finish()
への呼び出しを遅らせるだけです。
あなたが状態の大部分を保存する必要があるなら、あなたはかなり深い水に入っています、それは新しいインスタンスにそれを渡すことによって、特にあなたの古いContext/Activityを漏らさずにあなたの状態のすべてのプロパティを渡すことは自明ではないので。
何をしようとしているのかを指定してください。
あなたは単に使うことができます
onRestart()
以下の方法
@Override
protected void onRestart() {
super.onRestart();
setContentView(R.layout.add_entry);
}
そしてonRestart()を呼び出して、現在のアクティビティを再開します。
この目的を明確にしているIntent.makeRestartActivityTask()
について誰も言及していないのはなぜだろうか。
アプリケーションのタスク*をその基本状態で再起動するために使用できるインテントを作成します。
startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent())
このメソッドはデフォルトフラグとしてIntent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
を設定します。