🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

5263閲覧

Androidの通知が5秒経過するとタップしても消えない

Yuto_Hino

総合スコア12

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

1クリップ

投稿2019/10/10 09:03

編集2019/10/10 09:06

通知をタップしたら消えるようにしたいです。

通知がきて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

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

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

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

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

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

guest

回答1

0

ベストアンサー

5秒以降にタップして消えないのは以下で通知しているせいと考えます。
startForeground(1, notification)
理由はフォアグラウンドサービスの宣言をする通知のため、「消えない通知」です。
ユーザーにフォアグラウンドサービスだよとアピールするための通知なので消えては駄目です。
このアプリがバックグラウンドで動いてますよと知らせるために。
フォアグラウンドサービスの宣言は5秒以内に行う必要があります。

逆に以下の記述のために5秒以内でタップして消えるのでは?と考えます。
.setAutoCancel(true)
※foregroundサービス宣言の5秒以内なので消える??バグ??

startForeground(1, notification)で呼ぶなら、setAutoCancel(false)とすべきと考えます。

私も「setAutoCancel(true)」としてしまっているので直さなきゃです。。

投稿2019/10/10 16:45

編集2019/10/10 16:56
jun74

総合スコア338

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

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

Yuto_Hino

2019/10/11 07:34 編集

前回に引き続きご回答ありがとうございますm(_ _)m バックグランドの処理をユーザーに認識させるためにサービス稼働中は通知を消してはいけないのですね。 そうなるとForegroundService用の通知とアラームを止める用の通知は分けた方が良さそうでしょうか。 最終的に通知を2つに分けて、 サービス終了時にonDestroy()でチャンネルIDを指定して削除する方法を行いました。 ↓ // アラームを停止させたら、サービス終了時に通知を消す。 val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager manager.deleteNotificationChannel("foreground_notification") // ForegroundServiceの通知を削除 manager.deleteNotificationChannel("alarm_notification") // アラームの通知を削除 これで完全に解決しました。 ありがとうございました(^^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問