Posted at

Activityを再起動させたいけど余分な画面を一枚挟まないといけない…という場合に有効なライブラリ


はじめに

画面Aを再起動させたい場合に、以下のように

画面A => 画面X => 画面A

「画面Xを挟まないとうまく再起動できない!」

という場合に有効なライブラリを紹介します。

そんな場合あるか?と思われた方、すみませんが

外部のプロジェクトで発生した事象ですので詳しく言えません(T_T)

ですが、覚えておくといつか役に立つライブラリだと思いますので、

頭の片隅にでも入れておいて損はないはずです!


ProcessPhoenix

そのライブラリの名は、ProcessPhoenix !!!!!

(かっこいい。。。)

https://github.com/JakeWharton/ProcessPhoenix

URLでもおわかりの通り、

あのAndroidの神、JakeWhartonさんが書いたOSSライブラリです。

(おぉ〜!!!)


Process Phoenix facilitates restarting your application process.

プロセスフェニックスは、アプリケーションプロセスの再起動を容易にします。


名前の通り、不死鳥のようにプロセスを蘇らせるライブラリです。

使い方もとっても簡単です。


1. build.gradleに依存関係を設定


build.gradle

dependencies {

implementation 'com.jakewharton:process-phoenix:2.0.0'
}


2. ProcessPhoenix#triggerRebirthを実行

今回は特定のインテントで起動したいので、

val intent = Intent(context, MainActivity::class.java)

ProcessPhoenix.triggerRebirth(context, intent)

以上です!(早っ!)


補足

ちなみに、、、

#triggerRebirthの定義は次のようになっています。


ProcessPhoenix.java

public static void triggerRebirth(Context context, Intent... nextIntents) {

Intent intent = new Intent(context, ProcessPhoenix.class);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK); // In case we are called with non-Activity context.
intent.putParcelableArrayListExtra(KEY_RESTART_INTENTS, new ArrayList<>(Arrays.asList(nextIntents)));
context.startActivity(intent);
if (context instanceof Activity) {
((Activity) context).finish();
}
Runtime.getRuntime().exit(0); // Kill kill kill!
}

これくらいの処理なら自分でもできry...

これをKotlinで書くと、スコープ関数を使えば

fun triggerRebirth(context: Context, vararg nextIntents: Intent) {

Intent(context, ProcessPhoenix::class.java).apply {
addFlags(FLAG_ACTIVITY_NEW_TASK)
putParcelableArrayListExtra(KEY_RESTART_INTENTS, ArrayList(Arrays.asList(*nextIntents)))
context.startActivity(this)
}
if (context is Activity) {
context.finish()
}
Runtime.getRuntime().exit(0)
}

このようにスッキリと書くことができます。

スコープ関数については、[コチラ] の記事を参照ください。

スマートキャストも効いてイイ感じですね。

やっぱりKotlinは書きやすい!


おわりに

一度聞いたら忘れない名前のインパクト!