通知をタップしたら消えるようにしたいです。
通知がきて5秒以内にタップすれば通知は消えますが、
5秒経つと通知が再表示され、それ以降はタップしても通知は残ったままになります。
notificationのsetAutoCancel(true)、
notification.flags = Notification.FLAG_AUTO_CANCEL
はしっかり記述しています。
この通知はサービスから呼び出していますが、
サービスが2回起動しているわけではありません。
通知も1回しか起動していません。
タップ後はサービスも終了させています。
ForegroundService.kt
kotlin
1... 2 3 override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { 4 5 if (intent.getStringExtra("alarm")?.toString() == "on") { 6 // アラーム起動 7 fireNotification() // 通知起動 8 // 何も操作がなければ1分後に自動的にスヌーズにする(5回まで) 9 if (autoSnoozeCount < 5) { 10 snoozeHandler = Handler() 11 runSnooze = Runnable { 12 autoSnoozeCount++ // カウントアップ 13 // スヌーズ実行 14 val snoozeIntent = Intent(this, AlarmSnoozeBroadcastReceiver::class.java) 15 sendBroadcast(snoozeIntent) 16 } 17 snoozeHandler?.postDelayed(runSnooze!!, 60000) 18 } else { 19 val handler = Handler() 20 handler.postDelayed({ 21 // アラームストップ 22 val alarmStopIntent = Intent(this, AlarmStopBroadcastReceiver::class.java) 23 sendBroadcast(alarmStopIntent) 24 }, 60000) 25 } 26 } 27 28 return START_STICKY 29 } 30 31 override fun onDestroy() { 32 super.onDestroy() 33 // タップしてアラームを停止させた場合、1分後のスヌーズ処理をキャンセル 34 snoozeHandler?.removeCallbacks(runSnooze!!) 35 } 36 37 // 通知メソッド 38 @TargetApi(Build.VERSION_CODES.O) 39 private fun fireNotification(): Int { 40 // NotificationManagerを取得 41 val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager 42 // カテゴリー名(通知設定画面に表示される情報) 43 val name = "指定時刻のアラーム" 44 // システムに登録するChannelのID 45 val id = "casareal_foreground" 46 // 通知の詳細情報(通知設定画面に表示される情報) 47 val notifyDescription = "指定時刻にアラームが通知されます" 48 49 // Channelの取得と生成 50 if (manager.getNotificationChannel(id) == null) { 51 val mChannel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) 52 mChannel.apply { 53 description = notifyDescription 54 setSound(null, null) // 通知音を鳴らさない 55 } 56 manager.createNotificationChannel(mChannel) 57 } 58 59 // アラームストップの処理をブロードキャストに伝える 60 val alarmStopIntent = Intent(this, AlarmStopBroadcastReceiver::class.java) 61 ... 62 .putExtra("requestCode", setRequestCode!!.toString()) 63 ... 64 val stopPi = PendingIntent.getBroadcast( 65 this, 66 setRequestCode!!, 67 alarmStopIntent, 68 PendingIntent.FLAG_UPDATE_CURRENT 69 ) 70 71 // スヌーズの処理をブロードキャストに伝える 72 val snoozeIntent = Intent(this, AlarmSnoozeBroadcastReceiver::class.java) 73 ... 74 .putExtra("requestCode", setRequestCode!!.toString()) 75 ... 76 val snoozePi = PendingIntent.getBroadcast( 77 this, 78 setRequestCode!!, 79 snoozeIntent, 80 PendingIntent.FLAG_UPDATE_CURRENT 81 ) 82 83 val notification = NotificationCompat.Builder(this, id) 84 .setAutoCancel(true) 85 .setContentTitle(setLabelText) 86 .setContentText(setSpeakText) 87 .setSmallIcon(R.drawable.ic_launcher_background) 88 .addAction(R.drawable.ic_launcher_background, "OK", stopPi) 89 .addAction(R.drawable.ic_launcher_background, "スヌーズ", snoozePi) 90 .build() 91 92 notification.flags = Notification.FLAG_AUTO_CANCEL // サービス終了時に通知を消す 93 notification.flags = Notification.FLAG_NO_CLEAR // スライドしても消えない 94 95 Thread( 96 Runnable { 97 (0..5).map { 98 Thread.sleep(1000) 99 } 100 stopForeground(STOP_FOREGROUND_DETACH) 101 }).start() 102 103 startForeground(1, notification) 104 105 return START_STICKY 106 } 107} 108
【環境】
Android Studio3.5
Android 10
よろしくお願いしますm(_ _)m
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/11 07:34 編集