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

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

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

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

Android Studio

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

Kotlin

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

Q&A

0回答

319閲覧

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

chiryou

総合スコア3

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2023/02/25 09:19

編集2023/03/01 18:27

実現したいこと

  • 通知機能が正常に動作するようにする

前提

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

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

特になし

AndroidManifest.xml

kotlin

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools"> 4 <uses-permission android:name="android.permission.INTERNET " /> 5 <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> 6 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 7 <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> 8 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 9 10 <application 11 android:allowBackup="true" 12 android:dataExtractionRules="@xml/data_extraction_rules" 13 android:fullBackupContent="@xml/backup_rules" 14 android:icon="@mipmap/ic_launcher" 15 android:label="@string/app_name" 16 android:roundIcon="@mipmap/ic_launcher_round" 17 android:supportsRtl="true" 18 android:theme="@style/Theme.Ohurocchi" 19 tools:targetApi="31" 20 tools:ignore="LockedOrientationActivity"> 21 <activity 22 android:name=".BackgroundActivity" 23 android:exported="false" 24 android:screenOrientation="portrait"/> 25 <activity 26 android:name=".DressupActivity" 27 android:exported="false" 28 android:screenOrientation="portrait"/> 29 <activity 30 android:name=".BathlogActivity" 31 android:exported="false" 32 android:screenOrientation="portrait"/> 33 <activity 34 android:name=".NameActivity" 35 android:exported="true" 36 android:screenOrientation="portrait"/> 37 <activity 38 android:name=".CreditActivity" 39 android:exported="true" 40 android:screenOrientation="portrait" /> 41 <activity 42 android:name=".AlarmActivity" 43 android:exported="true" 44 android:screenOrientation="portrait" /> 45 <activity 46 android:name=".TitleActivity" 47 android:exported="true" 48 android:screenOrientation="portrait"> 49 <intent-filter> 50 <action android:name="android.intent.action.MAIN" /> 51 <category android:name="android.intent.category.LAUNCHER" /> 52 </intent-filter> 53 54 <meta-data 55 android:name="android.app.lib_name" 56 android:value="" /> 57 </activity> 58 <activity 59 android:name=".HomeActivity" 60 android:exported="true" 61 android:screenOrientation="portrait" /> 62 <activity 63 android:name=".SettingActivity" 64 android:exported="true" 65 android:screenOrientation="portrait"> 66 </activity> 67 <activity 68 android:name=".CharaActivity" 69 android:exported="true" 70 android:screenOrientation="portrait"> 71 </activity> 72 <activity 73 android:name=".DressbuyActivity" 74 android:exported="true" 75 android:screenOrientation="portrait"> 76 </activity> 77 <activity 78 android:name=".CommonActivity" 79 android:exported="true" 80 android:screenOrientation="portrait"> 81 </activity> 82 <activity 83 android:name=".AuthActivity" 84 android:exported="true" 85 android:screenOrientation="portrait"> 86 </activity> 87 88 <meta-data 89 android:name="preloaded_fonts" 90 android:resource="@array/preloaded_fonts" /> 91 <provider 92 android:name="androidx.core.content.FileProvider" 93 android:authorities="${applicationId}.fileprovider" 94 android:exported="false" 95 android:grantUriPermissions="true"> 96 <meta-data 97 android:name="android.support.FILE_PROVIDER_PATHS" 98 android:resource="@xml/provider_paths" /> 99 </provider> 100 101 <receiver 102 android:name=".AlarmNotification" 103 android:process=":remote" > 104 </receiver> 105 106 </application> 107 108</manifest>

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? = null 23 private var pending: PendingIntent? = null 24 private val requestCode = 1 25 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 or 23 PendingIntent.FLAG_IMMUTABLE 24 ) 25 val channelId = "default" 26 // app name 27 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

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

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

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

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

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

jimbe

2023/02/25 15:55 編集

setInexactRepeating は不正確でも構わない場合に使うものです。("In"exact ですので。 ) そして、公式ドキュメントで指摘されている通り Doze 等でアラームが通らないこともあります。 また、setInexactRepeating は当日の分もスケジュールされますので、当日分を別途 set する必要はありません。 というか、 同じ PendingIntent を複数のアラームに関連付けても最後以外はキャンセルされると思います。
chiryou

2023/02/27 13:55

ご指摘ありがとうございます! 不要なコードは削除し、setInexactRepeatingのみにしたのですが当日分がいくら待っても通知が来ないのですが何か他に原因があるのでしょうか?
jimbe

2023/02/27 17:06 編集

具体的には、質問のコードをどのように修正して、アプリの edittext にはどのような値を入れたのでしょうか。 また、テストは実機でしょうか、エミュレータでしょうか。 androidmanifest.xml もご提示願えますか。
chiryou

2023/03/01 18:33

遅くなり申し訳ございません。AndroidManifest.xml公開いたしました。 また、修正箇所に関しましてですが77~83行目までを削除し、66~68行目の場所に am!!.setInexactRepeating( AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, pending) としました。 Edittextの値はTimePickerから選択した時刻が入っています。(例:12:00) 12:00から12と00だけ取り出し、12をHH,00をMMにいれ、それぞれIntに変換して入れています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問