前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー