前提
kotlinで目覚ましアプリを作ろうとしています.
TimePickerによる時刻の設定はできています.
実現したいこと
AlarmManagerを利用して,TimePickerで指定した時刻と現在時刻が一致したら,アラームを鳴らしたいと思っています.
発生している問題・エラーメッセージ
設定した時刻になっても通知がきません.
ソースコード
MainActivity.kt
kotlin
1package com.example.select_alarm 2 3import android.annotation.SuppressLint 4import android.app.AlarmManager 5import android.app.PendingIntent 6import android.content.Intent 7import android.icu.util.Calendar 8import androidx.appcompat.app.AppCompatActivity 9import android.os.Bundle 10import android.os.Handler 11import android.os.Looper 12import android.widget.Button 13import android.widget.TextView 14import android.icu.util.TimeZone 15import android.widget.Switch 16 17class MainActivity : AppCompatActivity() { 18 companion object { 19 const val REQUESTKEY_TIMEPICKER = "selectTime" 20 } 21 22 @SuppressLint("SetTextI18n", "MissingInflatedId") 23 override fun onCreate(savedInstanceState: Bundle?) { 24 super.onCreate(savedInstanceState) 25 setContentView(R.layout.activity_main) 26 27 val switch = findViewById<Switch>(R.id.switch1) 28 switch.setOnCheckedChangeListener{_,ischecked -> 29 if(ischecked){ 30 val alarmManager: AlarmManager = this.getSystemService(ALARM_SERVICE) as AlarmManager 31 val alarmIntent: PendingIntent = Intent(this, AlarmReceiver::class.java).let { intent -> 32 PendingIntent.getBroadcast(this, 0, intent, 0) 33 } 34 val calendar: Calendar = Calendar.getInstance().apply { 35 supportFragmentManager.setFragmentResultListener(REQUESTKEY_TIMEPICKER, this@MainActivity) { _, result -> 36 val Hour = result.getInt(TimePickerDialogFragment.RESULT_HOUR) 37 val Minute = result.getInt(TimePickerDialogFragment.RESULT_MINUTE) 38 timeInMillis = System.currentTimeMillis() 39 set(Calendar.HOUR_OF_DAY, Hour) 40 set(Calendar.MINUTE,Minute) 41 } 42 } 43 alarmManager.setInexactRepeating( 44 AlarmManager.RTC_WAKEUP, 45 calendar.timeInMillis, 46 AlarmManager.INTERVAL_DAY, 47 alarmIntent 48 ) 49 } 50 } 51 52 val nowText = findViewById<TextView>(R.id.nowText) 53 val alarmText = findViewById<TextView>(R.id.alarmText) 54 55 //TimePickerの表示 56 supportFragmentManager.setFragmentResultListener(REQUESTKEY_TIMEPICKER, this) { _, result -> 57 val hour = result.getInt(TimePickerDialogFragment.RESULT_HOUR) 58 val minute = result.getInt(TimePickerDialogFragment.RESULT_MINUTE) 59 if (minute in 0..9) { 60 alarmText.text = "${hour}時0${minute}分" 61 } else { 62 alarmText.text = "${hour}時${minute}分" 63 } 64 } 65 //ボタンによる時刻の設定 66 val btnSelectTime = findViewById<Button>(R.id.btnSelectTime) 67 btnSelectTime.setOnClickListener { 68 TimePickerDialogFragment.getInstance(REQUESTKEY_TIMEPICKER).show(supportFragmentManager, null) 69 } 70 71 72 73 val handler = Handler(Looper.getMainLooper()) 74 class TimeDrawer : Runnable { 75 override fun run() { 76 val calendar = Calendar.getInstance() 77 //タイムゾーンを設定⇒日本 78 val tz=TimeZone.getTimeZone("Asia/Tokyo") 79 calendar.timeZone=tz 80 //現在時間の表示 81 val hour = calendar.get(Calendar.HOUR_OF_DAY) 82 val minute = calendar.get(Calendar.MINUTE) 83 val second = calendar.get(Calendar.SECOND) 84 85 if(minute in 0..9){ 86 nowText.text = "${hour}時0${minute}分" 87 }else{ 88 nowText.text = "${hour}時${minute}分" 89 } 90 handler.postDelayed(this, (60 - second) * 1000L) 91 } 92 } 93 handler.post(TimeDrawer()) 94 95 } 96} 97
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 5 <application 6 android:allowBackup="true" 7 android:dataExtractionRules="@xml/data_extraction_rules" 8 android:fullBackupContent="@xml/backup_rules" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/Theme.SelectAlarm" 14 tools:targetApi="31"> 15 <activity 16 android:name=".MainActivity" 17 android:exported="true"> 18 <intent-filter> 19 <action android:name="android.intent.action.MAIN" /> 20 21 <category android:name="android.intent.category.LAUNCHER" /> 22 </intent-filter> 23 24 <meta-data 25 android:name="android.app.lib_name" 26 android:value="" /> 27 </activity> 28 <receiver android:name=".AlarmReceiver" android:process=":remote" /> 29 </application> 30 31</manifest>
AlarmReceiver.kt
kotlin
1package com.example.select_alarm 2 3import android.content.BroadcastReceiver 4import android.content.Context 5import android.content.Intent 6import android.widget.Toast 7 8class AlarmReceiver : BroadcastReceiver() { 9 override fun onReceive(context: Context, intent: Intent) { 10 val toast = Toast.makeText(context, "アラームによる処理が実行されました。", Toast.LENGTH_SHORT) 11 toast.show() 12 } 13}
試したこと
どこのコードの部分を改善したら、通知が来るようになるでしょうか?
また、他にこのようにしたほうが良いなど意見がございましたらよろしくお願いします.
補足情報(FW/ツールのバージョンなど)
下記のサイトをもとに作成にあたりました.
API:31
Android 12.0(s)

あなたの回答
tips
プレビュー