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

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

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

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

Android

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

Android Studio

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

Kotlin

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

Q&A

1回答

2673閲覧

アプリを起動していない時でもAlarmManagerで設定時間にアラームを鳴らす

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/11/14 12:48

○やりたいこと
アプリを立ち上げていない時でもAlarmManagerで設定時間にアラームを鳴らす

○困っていること
現在の実装状況は以下です。
1 アプリを立ち上げている(Foreground) → アラーム起動する
2 アプリを立ち上げている(Background) → アラーム起動する
3 アプリを起動していない(GONE) → アラーム起動しない

○教えていただきたいこと
アプリを起動していない時でも、AlarmManagerで指定した時間にアラームを起動したいです。
1、2が動作しているため、AppProcessStatusは狙い通りの動作をしていると考えます。

本内容についてご教授いただけないでしょうか。
よろしくお願い致します。

以下コードですが冗長なため省いている箇所があります。

AlarmReceiver

1 2class AlarmReceiver : BroadcastReceiver() { 3 companion object { 4 val ACTION_CALL = "called"; 5 } 6 7 var localReceiver: BroadcastReceiver? = null 8 9 override fun onReceive(context: Context?, intent: Intent?) { 10 11 if (context != null) { 12 //Foreground 13 if (AppProcessStatus.current(context) == AppProcessStatus.FOREGROUND) { 14 Log.d("debug", "FOREGROUND") 15 MyNotification.sendNotification(context) 16 val intentBack = Intent("Foreground") 17 LocalBroadcastManager.getInstance(context).sendBroadcast( Intent(intentBack) ) 18 19 //Background 20 } else if (AppProcessStatus.current(context) == AppProcessStatus.BACKGROUND) { 21 Log.d("debug", "BACKGROUND") 22 MyNotification.sendNotification(context) 23 val intentBack = Intent("Background") 24 LocalBroadcastManager.getInstance(context).sendBroadcast( Intent(intentBack) ) 25 26 //Gone 27 } else if (AppProcessStatus.current(context) == AppProcessStatus.GONE) { 28 Log.d("debug", "GONE") 29 MyNotification.sendNotification(context) 30 val intentBack = Intent("Gone") 31 LocalBroadcastManager.getInstance(context).sendBroadcast( Intent(intentBack) ) 32 } 33 } 34 } 35}

AppProcessStatus

1enum class AppProcessStatus { 2 /** 最前面で起動中 */ 3 FOREGROUND, 4 /** バックグラウンド状態 */ 5 BACKGROUND, 6 /** プロセスが存在しない */ 7 GONE; 8 9 companion object { 10 /** 現在のアプリのプロセスの状態を取得する */ 11 fun current(context: Context): AppProcessStatus { 12 if (!existsAppTask(context)) return GONE //アプリ閉じてる 13 if (isForeground(context)) return FOREGROUND //最前面で起動中 14 else return BACKGROUND //バックグラウンド状態 15 } 16 17 private fun isForeground(context: Context): Boolean { 18 val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager 19 val runningProcesses = am.runningAppProcesses 20 for (processInfo in runningProcesses) { 21 for (activeProcess in processInfo.pkgList) { 22 if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 23 return true 24 } 25 } 26 } 27 return false 28 } 29 30 private fun existsAppTask(context: Context): Boolean { 31 val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager 32 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 33 return am.appTasks.count() > 0 34 } 35 val recentTasks = am.getRunningTasks(Integer.MAX_VALUE) 36 for (i in recentTasks.indices) { 37 if (recentTasks[i].baseActivity?.packageName == context.packageName) { 38 return true 39 } 40 } 41 return false 42 } 43 } 44}

MainActivity

1class MainActivity : FragmentActivity(), TimePickerDialog.OnTimeSetListener { 2 3 private lateinit var binding: ActivityMainBinding 4 5 //Foreground 6 private val foregroundReceiver = object : BroadcastReceiver() { 7 override fun onReceive(context: Context?, intent: Intent?) { 8 val message = intent!!.action // Broadcast されたメッセージを取り出す 9 Log.d("debug", "message2: " + message.toString()) 10 moveToAlarm() //処理実行 11 } 12 } 13 14 //Background 15 private val backgroundReceiver = object : BroadcastReceiver() { 16 override fun onReceive(context: Context?, intent: Intent?) { 17 val message = intent!!.action 18 Log.d("debug", "message2: " + message.toString()) 19 moveToAlarmB() //処理実行 20 } 21 } 22 23 //Gone 24 private val goneReceiver = object : BroadcastReceiver() { 25 override fun onReceive(context: Context?, intent: Intent?) { 26 val message = intent!!.action 27 Log.d("debug", "message2: " + message.toString()) 28 moveToAlarm() //処理実行 29 } 30 } 31 32 override fun onCreate(savedInstanceState: Bundle?) { 33 super.onCreate(savedInstanceState) 34 binding = ActivityMainBinding.inflate(layoutInflater) 35 setContentView(binding.root) 36 37 //Foreground 38 LocalBroadcastManager.getInstance(this).registerReceiver( 39 foregroundReceiver, 40 IntentFilter("Foreground") 41 ) 42 //Background 43 LocalBroadcastManager.getInstance(this).registerReceiver( 44 backgroundReceiver, 45 IntentFilter("Background") 46 ) 47 LocalBroadcastManager.getInstance(this).registerReceiver( 48 goneReceiver, 49 IntentFilter("Gone") 50 ) 51 } 52}

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

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

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

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

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

guest

回答1

0

「アラーム」とアプリ画面との関係から良いかどうか判断つきませんが、 AlarmReceiver で Notification 出していますので通知時に鳴らすということでしたら

Androidの通知チャネルにオリジナル通知音を設定する

という記事が参考になるかもしれません。

投稿2021/11/15 09:30

jimbe

総合スコア12648

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

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

kakashi55

2021/11/15 12:52

ご回答いただきありがとうございます。 setSound() で通知音の実装をするのかと思うのですが、R.raw.bellsound.mp3を使用したい場合、 setSound( ) の()内の書き方はどのようになるのでしょうか。 (ここがわからず進めず困っております)
jimbe

2021/11/15 13:01

上のリンク先の URI 部分はちょっと危ない感じではありますが。 [Androidアプリの通知音をアプリ内蔵音源に変更してみた](https://dev.classmethod.jp/articles/change-android-notification-sound/ ) だと res/raw/sample_sound.mp3 に対して val uri = Uri.parse("android.resource://$packageName/${R.raw.sample_sound}") と書いてありますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問