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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

2454閲覧

BroadcastReceiverからMainActivityへの戻り方

kakashi55

総合スコア25

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2021/09/27 11:21

編集2021/09/28 12:35

android studioにてkotlinにて、以下を実装したいです。
初歩的な問題なのかと思いますが、実装できずに困っており、対応方法ご存知の方がおりましたらご教授いただけないでしょうか?

〇やりたいこと
1.AlarmManagerにてアラームをセット
2.アラーム時間になるとBroadcastReceiverが反応
3.Notificationを出す
4.MainActivityの処理に戻る  
5.soundPoolで音を鳴らす  ←ここができずに困っております。

〇追記
MyNotification.ktで、mainActivityのplayOneReady()メソッドを実行するものの、
soundManagerが初期化されていないということで以下エラーが出ます。
MainActivity.ktで、soundManagerの宣言、初期化はしているものの、
再度MainActiviyを呼び出す際に、soundManagerが再度宣言されるが、onCreate()を経由しないため、
初期化されずエラーになっていると考えています。
対応方法をご存知の方がおりましたらご教授いただけないでしょうか。

エラー
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property soundManager has not been initialized

kotlin

1 2class MainActivity : FragmentActivity(), TimePickerDialog.OnTimeSetListener { 3 private lateinit var binding: ActivityMainBinding 4 private lateinit var soundManager: SoundManager 5 6 var pickedHour: String = "hourTime" //選択された時間 7 var pickedMinute: String = "minuteTime" //選択された分 8 9 var hourInt = 0 10 var minuteInt = 0 11 12 var msg: String? = null 13 14 15 override fun onCreate(savedInstanceState: Bundle?) { 16 super.onCreate(savedInstanceState) 17 binding = ActivityMainBinding.inflate(layoutInflater) 18 setContentView(binding.root) 19 20 soundManager = SoundManager(this) 21 22 23 //決定ボタン押す 24 binding.btnDecide.setOnClickListener { 25 if (hourInt == 0){ 26 Log.d("debug", "時間設定されていない") 27 msg = "時間を設定して下さい" 28 Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() 29 30 } else { 31 Log.d("debug", "時間設定された") 32 val str = String.format(Locale.US, "%d:%d", hourInt, minuteInt) 33 binding.alarmTime.text = str 34 35 msg = "アラーム設定しました" 36 Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() 37 alarmSet() //アラームセット 38 } 39 } 40 } 41 42 43 44 private fun alarmSet() { 45 Log.d("debug", "alarmSet") 46 val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager 47 val calendar = Calendar.getInstance() 48 49 var year = calendar.get(Calendar.YEAR) 50 var month = calendar.get(Calendar.MONTH) 51 var day = calendar.get(Calendar.DAY_OF_MONTH) 52 53 val intent = Intent(this, MyReceiver::class.java) 54 val pendingIntent = PendingIntent.getBroadcast( 55 this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT 56 ) 57 58 calendar.add(Calendar.SECOND, 10) 59 alarmManager.setExact( //正確な時間を設定するsetExact() 60 AlarmManager.RTC_WAKEUP, 61 //calendar.getTimeInMillis(), 62 calendar.timeInMillis, 63 pendingIntent 64 ) 65 Log.d("debug", "alarmSet End") 66 } 67 68 69 //タイマーセット(データを受け取る) TimePickクラスではなくこちらで処理 70 override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) { 71 72 val str = String.format(Locale.US, "%d:%d", hourOfDay, minute) 73 binding.showTime.text = str 74 75 hourInt = hourOfDay 76 minuteInt = minute 77 78 hourZero = hourOfDay.toString() 79 pickedHour = hourZero 80 pickedMinute = minuteZero 81 } 82 83 //時計ダイアログを表示 84 fun showTimePickerDialog(v: View) { 85 val newFragment = TimePick() //TimePickクラスのインスタンス化 86 newFragment.show(supportFragmentManager, "timePicker") 87 } 88}

kotlin

1 2class MyReceiver : BroadcastReceiver() { 3 4 private lateinit var mainActivity: MainActivity 5 6 override fun onReceive(context: Context?, intent: Intent?) { 7 Log.d("debug", "MyReceiver") 8 9 if (context != null) { 10 Log.d("debug", "MyReceiver Inside") 11 MyNotification.sendNotification(context) 12 13 Log.d("debug", "MyReceiver playOneReady ") 14 } 15 } 16}

kotlin

1 2class MyNotification { 3 4 companion object { 5 private const val NOTIFICATION_CHANNEL_ID = "com.example.sample_alarm_manager_channel_id" 6 private const val NOTIFICATION_CHANNEL_NAME = "Time for Workout!!" 7 private const val NOTIFICATION_CHANNEL_DESCRIPTION = "Go To The Gym" 8 private const val NOTIFICATION_TITLE = "sample alarm manager" 9 private const val NOTIFICATION_MESSAGE = "test message." 10 11 fun sendNotification(context: Context) { 12 Log.d("debug", "MyNotification sendNotification") 13 14 val channelId = NOTIFICATION_CHANNEL_ID 15 val channelName = NOTIFICATION_CHANNEL_NAME 16 val channelDescription = NOTIFICATION_CHANNEL_DESCRIPTION 17 18 //Android 8.0 以上ではアプリの通知チャンネルを登録することが必要。 19 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 20 val importance = NotificationManager.IMPORTANCE_DEFAULT 21 val channel = NotificationChannel(channelId, channelName, importance).apply { 22 description = channelDescription 23 } 24 val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager 25 manager.createNotificationChannel(channel) 26 } 27 28 //通知をシステムに登録しています。 29 val builder = NotificationCompat.Builder(context, channelId).apply { 30 setSmallIcon(R.drawable.ic_baseline_info_24) 31 setContentTitle(NOTIFICATION_TITLE) 32 setContentText(NOTIFICATION_MESSAGE) 33 priority = NotificationCompat.PRIORITY_DEFAULT 34 } 35 36 val id = 0 37 NotificationManagerCompat.from(context).notify(id, builder.build()) 38 39 Log.d("debug", "MyNotification sendNotification End") 40 41 //mainActivityのplayOneReady()メソッドを実行 42 val mainActivity = MainActivity() 43 mainActivity.playOneReady() 44 } 45 } 46 47}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/09/27 11:35

4.MainActivityの処理に戻る とは具体的にどういうことでしょう NotificationをタップしたらMainActivityが開くように とかでしょうか
kakashi55

2021/09/27 12:04

hiroshiki様 ご返答ありがとうございます。 Notificationタップ後、MainActivityが開くようにしたいです。 その後、サウンド等の処理をMainActivityで行いたいと考えております。
guest

回答1

0

ベストアンサー

以下の 「通知のタップアクションを設定する」 の箇所にあるようにpendingIntentをセットすると
通知タップでMainActivityを開くようなことはできるかと思います

https://developer.android.com/training/notify-user/build-notification?hl=ja

intentに対して任意のActionをセットして
MainActivity側ではそのActionがあるときはこういう処理をする みたいな実装にすると

アプリアイコンから起動したときは鳴らさず
通知から開かれたら音を鳴らす みたいなことができると思います

投稿2021/09/27 12:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kakashi55

2021/09/27 13:39

ご回答いただきありがとうございます。 もう一点教えていただきたいのですが、以下を MyNotification.ktに追加した場合、 MainActivity.kt内での処理はどのように書くべきでしょうか? MyNotification.kt //追加1 val intent2 = Intent(this, MainActivity::class.java).apply { var flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } //追加2 val pendingIntent2: PendingIntent = PendingIntent.getActivity(this, 0, intent2, 0) //通知をシステムに登録しています。 val builder = NotificationCompat.Builder(context, channelId).apply { setSmallIcon(R.drawable.ic_baseline_info_24) setContentTitle(NOTIFICATION_TITLE) setContentText(NOTIFICATION_MESSAGE) priority = NotificationCompat.PRIORITY_DEFAULT //追加3 通知タップでアクションを設定 setContentIntent(pendingIntent2) setAutoCancel(true) }
kakashi55

2021/09/28 06:21

ご返答ありがとうございます。 この内容で進めてみます。 もう少し詳細であったり、他の方法だったりを知りたい為、暫くは他の回答を待ちたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問