簡単なサンプルで実験してみます。二つのアクティビティ(MainActivity/SubActivity)それぞれにフラグメント(MainFragment/SubFramgnet)を載せ、ボタンでアクティビティを行き来します。

MainActivity.kt
kotlin
1import android.content.Intent
2import android.os.Bundle
3import android.util.Log
4import androidx.appcompat.app.AppCompatActivity
5
6class MainActivity : AppCompatActivity() {
7 override fun onCreate(savedInstanceState: Bundle?) {
8 super.onCreate(savedInstanceState)
9 setContentView(R.layout.activity_main)
10
11 Log.d("MainActivity", "onCreate()")
12
13 val fm = supportFragmentManager
14
15 fm.setFragmentResultListener("toSub", this) { requestKey, result ->
16 startActivity(Intent(this, SubActivity::class.java))
17 }
18
19 fm.beginTransaction().replace(R.id.fragment_container_view, MainFragment()).commit();
20 }
21}
res/layout/activity_main.xml
xml
1<?xml version="1.0" encoding="utf-8"?>
2<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 android:id="@+id/fragment_container_view"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".MainActivity" />
MainFragment.kt
kotlin
1import android.os.Bundle
2import android.util.Log
3import android.view.View
4import android.widget.Button
5import androidx.fragment.app.Fragment
6
7class MainFragment : Fragment(R.layout.fragment_main) {
8 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
9 super.onViewCreated(view, savedInstanceState)
10
11 Log.d("MainFragment", "onViewCreated()")
12
13 view.findViewById<Button>(R.id.toSubButton).setOnClickListener { v: View? ->
14 parentFragmentManager.setFragmentResult("toSub", Bundle());
15 }
16 }
17}
res/layout/fragment_main.xml
xml
1<?xml version="1.0" encoding="utf-8"?>
2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:background="#00ffff"
8 tools:context=".MainFragment">
9
10 <TextView
11 android:id="@+id/textView"
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:text="MAIN"
15 android:textSize="40dp"
16 app:layout_constraintBottom_toTopOf="@id/toSubButton"
17 app:layout_constraintEnd_toEndOf="parent"
18 app:layout_constraintStart_toStartOf="parent"
19 app:layout_constraintTop_toTopOf="parent" />
20 <Button
21 android:id="@+id/toSubButton"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:text="to SUB"
25 app:layout_constraintBottom_toBottomOf="parent"
26 app:layout_constraintEnd_toEndOf="parent"
27 app:layout_constraintStart_toStartOf="parent"
28 app:layout_constraintTop_toBottomOf="@id/textView" />
29
30</androidx.constraintlayout.widget.ConstraintLayout>
※ 以下のサブ関係はメインの "sub" と "main" を入れ替えた感じです。
SubActivity.kt
kotlin
1import android.content.Intent
2import android.os.Bundle
3import android.util.Log
4import androidx.appcompat.app.AppCompatActivity
5
6class SubActivity : AppCompatActivity() {
7 override fun onCreate(savedInstanceState: Bundle?) {
8 super.onCreate(savedInstanceState)
9 setContentView(R.layout.activity_sub)
10
11 Log.d("SubActivity", "onCreate()")
12
13 val fm = supportFragmentManager
14
15 fm.setFragmentResultListener("toMain", this) { requestKey, result ->
16 startActivity(Intent(this, MainActivity::class.java))
17 }
18
19 fm.beginTransaction().replace(R.id.fragment_container_view, SubFragment()).commit();
20 }
21}
res/layout/activity_sub.xml
xml
1<?xml version="1.0" encoding="utf-8"?>
2<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 android:id="@+id/fragment_container_view"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".SubActivity" />
SubFragment.kt
kotlin
1import android.os.Bundle
2import android.util.Log
3import android.view.View
4import android.widget.Button
5import androidx.fragment.app.Fragment
6
7class SubFragment : Fragment(R.layout.fragment_sub) {
8 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
9 super.onViewCreated(view, savedInstanceState)
10
11 Log.d("SubFragment", "onViewCreated()")
12
13 view.findViewById<Button>(R.id.toMainButton).setOnClickListener { v: View? ->
14 parentFragmentManager.setFragmentResult("toMain", Bundle());
15 }
16 }
17}
res/layout/fragment_sub.xml
xml
1<?xml version="1.0" encoding="utf-8"?>
2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:background="#ffff00"
8 tools:context=".SubFragment">
9
10 <TextView
11 android:id="@+id/textView"
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:text="SUB"
15 android:textSize="40dp"
16 app:layout_constraintBottom_toTopOf="@id/toMainButton"
17 app:layout_constraintEnd_toEndOf="parent"
18 app:layout_constraintStart_toStartOf="parent"
19 app:layout_constraintTop_toTopOf="parent" />
20 <Button
21 android:id="@+id/toMainButton"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:text="to MAIN"
25 app:layout_constraintBottom_toBottomOf="parent"
26 app:layout_constraintEnd_toEndOf="parent"
27 app:layout_constraintStart_toStartOf="parent"
28 app:layout_constraintTop_toBottomOf="@id/textView" />
29
30</androidx.constraintlayout.widget.ConstraintLayout>
これを開発者オプション『アクティビティを保持しない』を ON にして実行し、サブアクティビティに移動した上で別のアプリを起動する等して裏に回してから表に出すと、ログには onCreate や onViewCreated が出てサブアクティビティが再生成・表示されます。
これをメインが表示されるようにするというのが目標の一つのようですので、アクティビティをメインだけにし画面遷移はフラグメントの切り替えだけにします。
修正は MainActivity だけです。(だけで済むように作ったんですけど^^; )
MainActivity.kt
kotlin
1//import android.content.Intent
2import android.os.Bundle
3import android.util.Log
4import androidx.appcompat.app.AppCompatActivity
5
6class MainActivity : AppCompatActivity() {
7 override fun onCreate(savedInstanceState: Bundle?) {
8 super.onCreate(savedInstanceState)
9 setContentView(R.layout.activity_main)
10
11 Log.d("MainActivity", "onCreate()")
12
13 val fm = supportFragmentManager
14
15 fm.setFragmentResultListener("toSub", this) { requestKey, result ->
16 //startActivity(Intent(this, SubActivity::class.java))
17 fm.beginTransaction().replace(R.id.fragment_container_view, SubFragment()).commit();
18 }
19 fm.setFragmentResultListener("toMain", this) { requestKey, result -> //SubActivity から持ってきた
20 //startActivity(Intent(this, MainActivity::class.java))
21 fm.beginTransaction().replace(R.id.fragment_container_view, MainFragment()).commit();
22 }
23
24 fm.beginTransaction().replace(R.id.fragment_container_view, MainFragment()).commit();
25 }
26}
もし「やっぱり終わった時の状態で再開させたい」となりましたら、 24 行目を savedInstanceState == null の時だけ実行するようにすれば、マルチアクティビティに戻す必要はありません。
kotlin
1 if(savedInstanceState == null) {
2 fm.beginTransaction().replace(R.id.fragment_container_view, MainFragment()).commit();
3 }