複数のアクティビティ間で処理をアレコレすることはとても面倒くさく、またOSにもそこそこ負担です。
(質問ではBからAへの遷移が常に成功する前提のようですが、遷移した瞬間にAが居なくなる可能性もあります。)
アクティビティをアプリで1つだけとし、各画面をフラグメントで構成してフラグメントを入れ換えることで画面遷移を実現すれば、悩まずに済むと思います。
(ついでに、ダイアログもそのまま使うとアクティビティが再生成されたときにダイアログは再生成されません。ダイアログフラグメントを使うと再生成されます。)
テキトウに作ったサンプルです。AからBに行きスレッドを実行すると3秒後(その間にAに戻って)ダイアログが出ます。
MainActivity.java
java
1import androidx.appcompat.app.AppCompatActivity;
2import androidx.fragment.app.*;
3import androidx.lifecycle.*;
4
5import android.os.Bundle;
6
7public class MainActivity extends AppCompatActivity {
8 enum Transfer {
9 A() { Fragment createFragment() { return new AFragment(); } },
10 B() { Fragment createFragment() { return new BFragment(); } };
11 abstract Fragment createFragment();
12 }
13
14 private static String TELEGRAM_ALERT_DIALOG_TAG = "TelegramAlertDialog";
15
16 @Override
17 protected void onCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.activity_main);
20
21 FragmentManager fm = getSupportFragmentManager();
22
23 MainViewModel model = new ViewModelProvider(this).get(MainViewModel.class);
24 model.getTransfer().observe(this, transfer -> {
25 if(transfer == null) return;
26 fm.beginTransaction()
27 .replace(R.id.fragment_container_view, transfer.createFragment())
28 .commit();
29 });
30
31 model.getTelegramErrorCode().observe(this, errorCode -> {
32 if(errorCode == null || errorCode.isEmpty() || fm.findFragmentByTag(TELEGRAM_ALERT_DIALOG_TAG) != null) return;
33 AlertDialogFragment.getInstance(errorCode).show(fm, TELEGRAM_ALERT_DIALOG_TAG);
34 model.setTelegramErrorCode(null);
35 });
36
37 if(savedInstanceState == null) {
38 model.setTransfer(Transfer.A);
39 }
40 }
41}
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 android:id="@+id/fragment_container_view"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent" />
MainViewModel.java
java
1import androidx.lifecycle.*;
2
3public class MainViewModel extends ViewModel {
4 private MutableLiveData<MainActivity.Transfer> transferLiveData = new MutableLiveData<>();
5 LiveData<MainActivity.Transfer> getTransfer() {
6 return transferLiveData;
7 }
8 void setTransfer(MainActivity.Transfer transfer) {
9 transferLiveData.setValue(transfer);
10 }
11
12 private MutableLiveData<String> telegramErrorCodeLiveData = new MutableLiveData<>();
13 LiveData<String> getTelegramErrorCode() {
14 return telegramErrorCodeLiveData;
15 }
16 void setTelegramErrorCode(String errorCode) {
17 telegramErrorCodeLiveData.setValue(errorCode);
18 }
19
20 void startThread() {
21 new Thread(
22 () -> {
23 try {
24 Thread.sleep(3 * 1000); //[ms]
25 } catch(InterruptedException e) {
26 telegramErrorCodeLiveData.postValue("B8");
27 return;
28 }
29 telegramErrorCodeLiveData.postValue("ABCDEF");
30 }
31 ).start();
32 }
33}
AlertDialogFragment.java
java
1import android.app.Dialog;
2import android.content.Context;
3import android.os.Bundle;
4
5import androidx.annotation.*;
6import androidx.appcompat.app.AlertDialog;
7import androidx.fragment.app.DialogFragment;
8
9public class AlertDialogFragment extends DialogFragment {
10 static DialogFragment getInstance(String errorCode) {
11 if(errorCode == null || errorCode.length() == 0) return null;
12
13 DialogFragment df = new AlertDialogFragment();
14 Bundle args = new Bundle();
15 args.putString("ErrorCode", errorCode);
16 df.setArguments(args);
17 return df;
18 }
19
20 @NonNull
21 @Override
22 public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
23 String errorCode = requireArguments().getString("ErrorCode", null);
24 FileUtils.outputLogFile(getContext(), Constants.LOG_ALERT, "伝文エラー:" + errorCode, null);
25
26 // タイトルとメッセージの生成
27 String title, message;
28 if (errorCode.equals("B8")) { //「B8」エラーの場合のみ異なるメッセージを出す
29 title = "登録エラー";
30 message = "予約を完了する事が出来ませんでした";
31 } else {
32 title = getString(R.string.confirm_telegram_error_title);
33 message = getString(R.string.confirm_telegram_message) + "\nエラーコード:" + errorCode;
34 }
35
36 setCancelable(false); //false でダイアログ外のタッチやバック操作でのダイアログのキャンセルを出来なくする.
37
38 return new AlertDialog.Builder(requireActivity())
39 .setTitle(title)
40 .setMessage(message)
41 .setPositiveButton("閉じる", (d, w) -> {})
42 .create();
43 }
44}
45
46//テスト用ダミー
47enum Constants {
48 LOG_ALERT
49}
50class FileUtils {
51 static void outputLogFile(Context context, Constants constants, String contents, Object obj) {}
52}
AFragment.java
java
1import android.os.Bundle;
2import android.view.View;
3import android.widget.Button;
4
5import androidx.annotation.*;
6import androidx.fragment.app.Fragment;
7import androidx.lifecycle.ViewModelProvider;
8
9public class AFragment extends Fragment {
10 public AFragment() {
11 super(R.layout.fragment_a);
12 }
13
14 @Override
15 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
16 super.onViewCreated(view, savedInstanceState);
17
18 MainViewModel model = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
19
20 Button toB = view.findViewById(R.id.toB_button);
21 toB.setOnClickListener(v -> model.setTransfer(MainActivity.Transfer.B));
22 }
23}
layout/fragment_a.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="#ffc0c0"
8 tools:context=".AFragment">
9
10 <TextView
11 android:id="@+id/text"
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:text="A"
15 android:textSize="50dp"
16 app:layout_constraintBottom_toBottomOf="parent"
17 app:layout_constraintEnd_toEndOf="parent"
18 app:layout_constraintStart_toStartOf="parent"
19 app:layout_constraintTop_toTopOf="parent" />
20 <Button
21 android:id="@+id/toB_button"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:text="to B"
25 app:layout_constraintBottom_toBottomOf="parent"
26 app:layout_constraintEnd_toEndOf="parent"
27 app:layout_constraintStart_toStartOf="parent"
28 app:layout_constraintTop_toBottomOf="@id/text" />
29</androidx.constraintlayout.widget.ConstraintLayout>
BFragment.java
java
1import android.os.Bundle;
2import android.view.View;
3import android.widget.Button;
4
5import androidx.annotation.*;
6import androidx.fragment.app.Fragment;
7import androidx.lifecycle.ViewModelProvider;
8
9public class BFragment extends Fragment {
10 public BFragment() {
11 super(R.layout.fragment_b);
12 }
13
14 @Override
15 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
16 super.onViewCreated(view, savedInstanceState);
17
18 MainViewModel model = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
19
20 Button threadButton = view.findViewById(R.id.thread_button);
21 threadButton.setOnClickListener(v -> {
22 model.startThread();
23 model.setTransfer(MainActivity.Transfer.A);
24 });
25 }
26}
layout/fragment_b.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="#80ffff"
8 tools:context=".BFragment">
9
10 <TextView
11 android:id="@+id/text"
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:text="B"
15 android:textSize="50dp"
16 app:layout_constraintBottom_toBottomOf="parent"
17 app:layout_constraintEnd_toEndOf="parent"
18 app:layout_constraintStart_toStartOf="parent"
19 app:layout_constraintTop_toTopOf="parent" />
20 <Button
21 android:id="@+id/thread_button"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:text="thread"
25 app:layout_constraintBottom_toBottomOf="parent"
26 app:layout_constraintEnd_toEndOf="parent"
27 app:layout_constraintStart_toStartOf="parent"
28 app:layout_constraintTop_toBottomOf="@id/text" />
29</androidx.constraintlayout.widget.ConstraintLayout>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。