質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1110閲覧

AlarmManager内での通知をタップした時にActivityを再生成せずに現在の画面へ飛びたい

tokoroten_12

総合スコア24

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/12/24 08:26

前提・実現したいこと

Android Studio 4.2.1、言語はJavaを使用しています。
現在Main画面ではCountDownTimerを用いて1秒ごとにカウントダウンしていくような処理を行っています。
イメージ説明

これにAlarmManagerを用いてバックグラウンドで動作する60秒のタイマーを作成し、30秒経過したらNotificationを使用して通知を画面上部に30秒経過の通知を表示したいと思っています。
また、この通知をクリックするとアプリのメイン画面に遷移して残りのカウントダウン(30~)を表示したいと考えています。

発生している問題・エラーメッセージ

AlarmManager内でpendingIntentを作成し通知をタップするとMain画面へ飛ぶようには出来たのですが、MainActivityが再生成されてしまうためカウントが60からになってしまいます。
MainActivtyとAlarmManagerのコードは下記のとおりです。

Intent.setFlagsでフラグを変更するなど試してみましたがうまく動作しません。
MainActivityを再生成するのではなく、カウントダウン中のMain画面へ飛ぶ方法はありますでしょうか?

java

1 2public class MainActivity extends AppCompatActivity { 3 4 CountDownTimer countDownTimer; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 // カレンダーを30秒に設定 12 Calendar cal = Calendar.getInstance(); 13 cal.setTimeInMillis(System.currentTimeMillis()); 14 cal.add(Calendar.SECOND, 30); 15 long alarm_time = cal.getTimeInMillis(); //カレンダーをミリ秒に変換して変数に格納 16 17 // Pending Intent使ってレシーバーをセットする 18 //アラームクロックインフォを作成してアラーム時間をセット 19 AlarmManager.AlarmClockInfo clockInfo = new AlarmManager.AlarmClockInfo(alarm_time,null); 20 Intent intent = new Intent(MainActivity.this, AlarmManagerTest.class); 21 PendingIntent pending = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); 22 23 // アラームをセットする 24 AlarmManager am = (AlarmManager)MainActivity.this.getSystemService(ALARM_SERVICE); 25 if(am != null){ 26 am.setAlarmClock(clockInfo, pending); 27 } 28 // 60秒のタイマーを設定 29 TimerStart(60); 30 } 31 32 /* 33 CountDownTimerを1秒毎に呼び出すように設定して時間のテキストを更新していく 34 */ 35 public void TimerStart(long time_sec) { 36 // 1秒毎に呼び出されるCountDownTimerを設定 37 countDownTimer = new CountDownTimer(time_sec*1000, 1000) { 38 @Override 39 public void onTick(long milliTillFinish) { 40 // 秒を計算する 41 int sec = (int) (milliTillFinish / 1000) % 60; 42 // TimerTextをxx形式で更新 43 String timerLeftFormatted = String.format(Locale.getDefault(), "%02d", sec+1); 44 ((TextView) findViewById(R.id.Timer_Text)).setText(timerLeftFormatted); 45 } 46 public void onFinish() { 47 // 終了時の動作 48 countDownTimer.cancel(); 49 ((TextView) findViewById(R.id.Timer_Text)).setText("終了"); 50 } 51 }; 52 countDownTimer.start(); 53 } 54 55} 56

java

1public class AlarmManagerTest extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 6 int requestCode = intent.getIntExtra("RequestCode",0); 7 String message = "30秒経過しました"; 8 String channelId = "default"; 9 String title = context.getString(R.string.app_name); 10 11 Intent tap_intent = new Intent(context, MainActivity.class); 12 tap_intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 13 14 PendingIntent pendingIntent = 15 PendingIntent.getActivity(context, requestCode, tap_intent, PendingIntent.FLAG_UPDATE_CURRENT); 16 17 NotificationManager notificationManager = 18 (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 19 20 Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 21 22 // Notification Channel 設定 23 NotificationChannel channel = new NotificationChannel( 24 channelId, title , NotificationManager.IMPORTANCE_DEFAULT); 25 26 channel.setDescription(message); 27 channel.enableVibration(true); 28 channel.canShowBadge(); 29 channel.enableLights(true); 30 channel.setLightColor(Color.BLUE); 31 // the channel appears on the lockscreen 32 channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); 33 channel.setSound(defaultSoundUri, null); 34 channel.setShowBadge(true); 35 36 if(notificationManager != null){ 37 notificationManager.createNotificationChannel(channel); 38 39 Notification notification = new Notification.Builder(context, channelId) 40 .setContentTitle(title) 41 // android標準アイコンから 42 .setSmallIcon(android.R.drawable.ic_lock_idle_alarm) 43 .setContentText(message) 44 .setAutoCancel(true) 45 .setContentIntent(pendingIntent) 46 .setWhen(System.currentTimeMillis()) 47 .build(); 48 49 // 通知 50 notificationManager.notify(R.string.app_name, notification); 51 } 52 } 53} 54

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/24 09:05

API のバージョンと AndroidManifest.xml をご提示願えますか。
guest

回答1

0

ベストアンサー

Activityを再生成せずに現在の画面へ飛びたい

通知からアクティビティの実行が行われる段階で、実行中の該当アクティビティが存在する補償はありません。
ですので、アクティビティの再生成は回避できません。
アクティビティが無くてもカウントが行われるような構造にするか、再生成されても「カウントがされていたかのように」動作するような構造にしてください。

投稿2021/12/24 11:03

編集2021/12/24 11:04
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokoroten_12

2021/12/27 00:45

遅くなりすみません。 大変申し訳ないのですが、上記のコードで動作確認を行った所意図した通りの動作になっていました。 テストコード内にtap_intent.setActionが紛れており、そちらを設定したためintentが上書きされるような動作になっていたようです。 > アクティビティの再生成は回避できません。 アクティビティの再生成は回避できない事を教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問