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

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

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

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

Android Studio

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

Q&A

解決済

2回答

2113閲覧

[Android]Notification.setFullScreenIntentによるスリープ中のActivity連続呼び出しを行いたい

tokoroten_12

総合スコア24

Java

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

Android Studio

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

0グッド

0クリップ

投稿2022/03/14 02:30

編集2022/03/15 06:47

開発・デバッグ環境

Android Studio:4.2.1
使用言語:Java
minSdkVersion:26
compileSdkVersion:31

デバッグ対象
HUAWEI P30
Androidバージョン 10

前提・実現したいこと

Android Studioでタイマーアプリを作成しようとしています。
その準備段階として、「10秒に1回AlarmManagerを呼び出し通知を作成し表示する」を繰り返す処理を行いたいと思っています。

MainActivityで10秒カウントしたらAlarmManager呼び出し。
AlarmManagerが呼ばれたらNotificationによる通知を作成し遷移するActivty(StopActivity)呼び出し。
StopActivtyで振動・音処理を行いボタンを押したらSTOPして終了。

といった流れの処理を行っています。

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

AlarmManager内でNotification.setFullScreenIntentを使ってStopActivityを呼び出しているのですが、最初の1回は呼び出せるのですが2回目以降はStopActivityが呼び出されずスリープ中に画面表示を行う事ができません。
どうすればActivityを連続して呼び出せるようになりますでしょうか?

以下にソースコードを示します。

該当のソースコード

java

1public class MainActivity extends AppCompatActivity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_main); 6 // 10秒のタイマーとアラームマネージャー設定 7 timerStart(10000); 8 AlarmManagerSetting(10); 9 } 10 11 public void timerStart(long time_msec) 12 { 13 CountDownTimer countDownTimer = new CountDownTimer(time_msec, 1000) { 14 @Override 15 public void onTick(long millisUntilFinished) { 16 } 17 @Override 18 public void onFinish() { 19 alarmManagerSetting(10); 20 timerStart(10000); 21 } 22 }; 23 countDownTimer.start(); 24 } 25 26 private void alarmManagerSetting(int time) 27 { 28 // 呼び出したい時間をセットする 29 Calendar cal = Calendar.getInstance(); 30 cal.setTimeInMillis(System.currentTimeMillis()); 31 cal.add(Calendar.SECOND, time); 32 long alarm_time = cal.getTimeInMillis(); //カレンダーをミリ秒に変換して変数に格納 33 34 //アラームクロックインフォを作成してアラーム時間をセット 35 AlarmManager.AlarmClockInfo clockInfo = new AlarmManager.AlarmClockInfo(alarm_time,null); 36 37 // Intentの設定、 38 Intent intent = new Intent(MainActivity.this, AlarmManagerTest.class); 39 PendingIntent pending = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); 40 41 // アラームをセットする 42 AlarmManager am = (AlarmManager)MainActivity.this.getSystemService(ALARM_SERVICE); 43 if(am != null){ 44 am.setAlarmClock(clockInfo, pending); 45 } 46 } 47}

java

1public class AlarmManagerTest extends BroadcastReceiver { 2 @Override 3 public void onReceive(Context context, Intent intent) { 4 // 通知する情報を作る 5 String channelId = "default"; 6 String title = context.getString(R.string.app_name); 7 String message = "時間が経過しました"; 8 NotificationManager notificationManager = 9 (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 10 11 // Notification Channel 設定 12 NotificationChannel channel = new NotificationChannel( 13 channelId, title, NotificationManager.IMPORTANCE_HIGH); 14 channel.setDescription(message); 15 channel.enableVibration(false); 16 17 // フルスクリーン用 18 Intent fullScreenIntent = new Intent(context, StopActivity.class); 19 PendingIntent fullScreenPendingIntent = 20 PendingIntent.getActivity(context, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT); 21 22 if (notificationManager != null) { 23 notificationManager.createNotificationChannel(channel); 24 25 Notification notification = new NotificationCompat.Builder(context, channelId) 26 .setContentTitle(title) // 設定されるタイトル 27 .setSmallIcon(android.R.drawable.ic_lock_idle_alarm) // 通知に表示されるアイコン 28 .setContentText(message) // 本文テキスト 29 .setAutoCancel(true) // タップすると通知が消去 30 .setWhen(System.currentTimeMillis()) // タイムスタンプ 31 .setFullScreenIntent(fullScreenPendingIntent, true) 32 .setCategory(NotificationCompat.CATEGORY_CALL) 33 .build(); 34 // 通知 35 notificationManager.notify(R.string.app_name, notification); 36 } 37 } 38}

java

1public class StopActivity extends AppCompatActivity { 2 3 SoundPool _soundPoolFinish; 4 int _sound; 5 public enum soundState { 6 // 列挙型により音声の定義 7 START, 8 STOP 9 } 10 Vibrator _vibrator; 11 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_stop); 17 18 Intent intent = getIntent(); 19 try { 20 // タイマーストップボタンのリスナ作成 21 Button bt_timer = findViewById(R.id.bt_stop); 22 StopActivity.HelloListener listener = new StopActivity.HelloListener(); 23 bt_timer.setOnClickListener(listener); 24 25      // 以下音声設定 26 AudioAttributes attributes = new AudioAttributes.Builder() 27 .setUsage(AudioAttributes.USAGE_GAME) 28 .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 29 .build(); 30 _soundPoolFinish = new SoundPool.Builder() 31 .setAudioAttributes(attributes) 32 .setMaxStreams(2) 33 .build(); 34 _sound = _soundPoolFinish.load(this, R.raw.timer, 1); 35 36// Thread.sleep(500); 37 38 // 音声スタート 39 _soundPoolFinish.play(_sound, 1.0F, 1.0F, 0, 0, 1.0F); 40 // バイブレーションを鳴らす 41 AudioAttributes audioAttributes = new AudioAttributes.Builder() 42 .setUsage(AudioAttributes.USAGE_ALARM) 43 .build(); 44 _vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 45 VibrationEffect ve = VibrationEffect.createWaveform(new long[]{0, 1000, 500, 1000, 500, 1000}, VibrationEffect.DEFAULT_AMPLITUDE); 46 _vibrator.vibrate(ve, audioAttributes); 47 48 } 49 catch (InterruptedException e){} 50 } 51 52 /** 53 ボタンを押したら振動と音とめて終了 54 */ 55 private class HelloListener implements View.OnClickListener { 56 @Override 57 public void onClick(View view) { 58 int id = view.getId(); 59 switch (id) { 60 case R.id.bt_stop: 61 _soundPoolFinish.stop(_sound); 62 _vibrator.cancel(); 63 finish(); 64 break; 65 } 66 } 67 } 68} 69

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.test"> 4 5 <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> 6 <uses-permission android:name="android.permission.VIBRATE" /> 7 <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" /> 8 <uses-permission android:name="android.permission.WAKE_LOCK" /> 9 10 <application 11 android:allowBackup="true" 12 android:icon="@mipmap/ic_launcher" 13 android:label="@string/app_name" 14 android:roundIcon="@mipmap/ic_launcher_round" 15 android:supportsRtl="true" 16 android:theme="@style/Theme.Test"> 17 <activity 18 android:name=".StopActivity" 19 android:showWhenLocked="true" 20 android:turnScreenOn="true"></activity> 21 <activity 22 android:name=".MainActivity" 23 android:exported="true"> 24 <intent-filter> 25 <action android:name="android.intent.action.MAIN" /> 26 <category android:name="android.intent.category.LAUNCHER" /> 27 </intent-filter> 28 </activity> 29 <receiver android:name=".AlarmManagerTest" /> 30 </application> 31</manifest> 32

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

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

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

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

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

tokoroten_12

2022/03/14 08:03

命名規則について読ませていただきました。 今回でいえばTimerStart、AlarmManagerSettingはメソッド名だから先頭文字を小文字にした方が良いって事ですよね? あと列挙型も先頭文字が大文字になってるから修正した方がよさそうですね。 ありがとうございます。
jimbe

2022/03/14 08:47 編集

動きを見ようと弄らさせて頂いていますが、一つ、ブロードキャストレシーバ AlarmManagerTest がマニフェストに登録されていないようです。 それと、StopActivity の onCreate で sleep をしていますが、 onCreate で時間を潰すことはしてはいけないことです。(システム全体が止まります。) 別の方法( Handler 等)で時間を潰す必要があります。
tokoroten_12

2022/03/15 06:53

>動きを見ようと弄らさせて頂いていますが、一つ、ブロードキャストレシーバ AlarmManagerTest がマニフェストに登録されていないようです。 こちらはマニフェストの下から3行目に書いてありましたので恐らく動いてるのではないかと…。 >それと、StopActivity の onCreate で sleep をしていますが、 onCreate で時間を潰すことはしてはいけないことです。(システム全体が止まります。) ご指摘ありがとうございます、知りませんでした。 いったんコメントアウトにて対応させていただきます。 色々試してみたのですがどうやらsetFullScreenIntentでAcitivityを呼び出した後、時間経過などではなくデバイスのロックの解除を行わなければAvtivity呼び出せないような動作になっているように思えます。 緊急の通知を連続で行う事に制限がありそうです
jimbe

2022/03/15 10:56 編集

> こちらはマニフェストの下から3行目に書いてありましたので恐らく動いてるのではないかと…。 御免なさい、こちら XML をコピペしていなかった所為でした。 私の方ではカウントダウンタイマーは使わず(結構ズレ易いイメージがあります)レシーバからアラームを再定義することで 10 秒毎に通知は来るようにしてみたのですが、音は鳴るのにバイブレータが動かず、その原因が分からず手間取っています^^; まぁバイブレータはともかく、レシーバからアラームを定義してしまうと止められないので、MainActivity を関係無く通知をするなら、サービス化したほうが良いかもしれません。
jimbe

2022/03/17 04:10

何度もすいません、@style/Theme.Test の内容を教えていただけますでしょうか。
guest

回答2

0

StopActivityでボタンを押した際に以下のように通知をキャンセルする事で再度StopActivityが呼び出されるようになった。

java

1NotificationManager notificationManager = 2(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 3notificationManager.cancel(id);

投稿2022/03/22 04:56

tokoroten_12

総合スコア24

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

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

0

ベストアンサー

How to Show an Activity on Lock Screen instead of a Notification
の最後の方に

The full screen activity will also not appear if you have an existing notification with the same id that has not been dismissed. Ideally you should cancel the notification by calling notificationManager.cancel(id) when the lock screen activity is destroyed.

(却下されていない同じIDの既存の通知がある場合も、全画面アクティビティは表示されません。理想的には、ロック画面アクティビティが破棄されたときにnotificationManager.cancel(id)を呼び出して、通知をキャンセルする必要があります。)

とありますので、残っている通知をキャンセルすれば表示されるかもしれません。

投稿2022/03/17 08:14

jimbe

総合スコア12644

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

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

tokoroten_12

2022/03/18 02:55 編集

おっしゃられている通り、STOPボタンを押した時に以下のように通知をキャンセルするようにしたらうまくいきました! NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(id); ありがとうございます、助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問