開発・デバッグ環境
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

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