繰り返し通知を実装すると当日だけ不安定な感覚で通知される。

実現したいこと

前提

kotlinで通知機能を取り入れたアプリを作っています。
通知の繰り返し機能を実装すると設定した時間に翌日以降はほぼ正確に通知されるようになりましたが、当日はなぜか12分後や8分後と不安定になってしまいました。

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

特になし

AlarmActivity.kt

kotlin

1package com.example.ohurocchi 2 3import android.app.AlarmManager 4import android.app.PendingIntent 5import android.app.TimePickerDialog 6import android.content.Intent 7import android.icu.text.SimpleDateFormat 8import android.icu.util.Calendar 9import android.media.MediaPlayer 10import android.os.Bundle 11import android.util.Log 12import android.widget.*13import androidx.appcompat.app.AppCompatActivity 14import com.google.firebase.firestore.ktx.firestore 15import com.google.firebase.ktx.Firebase 16 17 18class AlarmActivity : AppCompatActivity(){19 20 lateinit var text_et: EditText 21 22 private var am: AlarmManager? = null23 private var pending: PendingIntent? = null24 private val requestCode = 125 26 override fun onCreate(savedInstanceState: Bundle?) {27 super.onCreate(savedInstanceState)28 setContentView(R.layout.activity_alarm)29 30text_et = findViewById<EditText>(R.id.text_et) //EditText(入力エリア)31 32 //EditTextのクリックイベントを設定33 text_et.setOnClickListener {34 showTimePickerDialog()35 }36 37 //アラームを設定するボタン38 val buttonAlarm: Button = findViewById(R.id.buttonAlarm)39 buttonAlarm.setOnClickListener {40 val calendar = java.util.Calendar.getInstance()41 calendar.timeInMillis = System.currentTimeMillis()42 43 var number : String = text_et.text.toString()44 Log.d("TAG", number)45 val HH : String = number.toString().take(2)46 val hh : Int = HH.toInt()47 Log.d("TAG", HH)48 val MM : String = number.toString().takeLast(2)49 val mm : Int = MM.toInt()50 Log.d("TAG", MM)51 52 calendar.set(java.util.Calendar.HOUR_OF_DAY, hh)53 calendar.set(java.util.Calendar.MINUTE, mm)54 calendar.set(java.util.Calendar.SECOND, 0)55 56 val intent = Intent(applicationContext, AlarmNotification::class.java)57 intent.putExtra("RequestCode", requestCode)58 pending = PendingIntent.getBroadcast(59 applicationContext, requestCode, intent,60 PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE 61 )62 63 // アラームをセットする64 am = getSystemService(ALARM_SERVICE) as AlarmManager 65 if (am != null) {66 am!!.setExact(67 AlarmManager.RTC_WAKEUP,68 calendar.timeInMillis, pending)69 70 // トーストで設定されたことをを表示71 Toast.makeText(72 applicationContext,73 "入浴する時間を決定しました!", Toast.LENGTH_SHORT 74 ).show()75 Log.d("debug", "start")76 }77 // 繰り返しの設定78 am?.setInexactRepeating(79 AlarmManager.RTC_WAKEUP,80 calendar.timeInMillis ,81 AlarmManager.INTERVAL_DAY,82 pending 83 )84 }

AlarmNotification.kt

kotlin

1package com.example.ohurocchi 2 3import android.annotation.SuppressLint 4import android.app.NotificationChannel 5import android.app.NotificationManager 6import android.app.PendingIntent 7import android.content.BroadcastReceiver 8import android.content.Context 9import android.content.Intent 10import androidx.core.app.NotificationCompat 11import androidx.core.app.NotificationManagerCompat 12import java.text.SimpleDateFormat 13import java.util.*14 15class AlarmNotification : BroadcastReceiver() {16 // データを受信した17 @SuppressLint("MissingPermission")18 override fun onReceive(context: Context, intent: Intent) {19 val requestCode = intent.getIntExtra("RequestCode", 0)20 val pendingIntent = PendingIntent.getActivity(21 context, requestCode, intent,22 PendingIntent.FLAG_UPDATE_CURRENT or23 PendingIntent.FLAG_IMMUTABLE 24 )25 val channelId = "default"26 // app name27 val title = context.getString(R.string.app_name)28 val currentTime = System.currentTimeMillis()29 val dataFormat = SimpleDateFormat("HH:mm:ss", Locale.JAPAN)30 val cTime = dataFormat.format(currentTime)31 32 // メッセージ33 val message = "お風呂の時間です! $cTime"34 35 36 // Notification Channel 設定37 val channel = NotificationChannel(38 channelId, title,39 NotificationManager.IMPORTANCE_DEFAULT 40 )41 channel.description = message 42 val notificationManager =43 // (NotificationManager)context.getSystemService(NotificationManager.class);44 context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager 45 notificationManager.createNotificationChannel(channel)46 val builder = NotificationCompat.Builder(context, channelId)47 .setSmallIcon(R.drawable.ohurocchi_logo)48 .setContentTitle("おふろっち")49 .setContentText(message)50 .setPriority(NotificationCompat.PRIORITY_DEFAULT)51 .setContentIntent(pendingIntent)52 .setAutoCancel(true)53 val notificationManagerCompat = NotificationManagerCompat.from(context)54 55 56 57 // 通知58 notificationManagerCompat.notify(R.string.app_name, builder.build())59 }60}

試したこと

繰り返しの設定のコードを消すと当日は正確に通知されます。

補足情報(FW/ツールのバージョンなど)

以下参考にしたサイト
・https://developer.android.com/training/scheduling/alarms?hl=ja
・https://pg.akihiro-takeda.com/android-alarm/#toc10

コメントを投稿

0 コメント