開発・デバッグ環境
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
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 10秒のタイマーとアラームマネージャー設定 timerStart(10000); AlarmManagerSetting(10); } public void timerStart(long time_msec) { CountDownTimer countDownTimer = new CountDownTimer(time_msec, 1000) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { alarmManagerSetting(10); timerStart(10000); } }; countDownTimer.start(); } private void alarmManagerSetting(int time) { // 呼び出したい時間をセットする Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); cal.add(Calendar.SECOND, time); long alarm_time = cal.getTimeInMillis(); //カレンダーをミリ秒に変換して変数に格納 //アラームクロックインフォを作成してアラーム時間をセット AlarmManager.AlarmClockInfo clockInfo = new AlarmManager.AlarmClockInfo(alarm_time,null); // Intentの設定、 Intent intent = new Intent(MainActivity.this, AlarmManagerTest.class); PendingIntent pending = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); // アラームをセットする AlarmManager am = (AlarmManager)MainActivity.this.getSystemService(ALARM_SERVICE); if(am != null){ am.setAlarmClock(clockInfo, pending); } } }
java
public class AlarmManagerTest extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 通知する情報を作る String channelId = "default"; String title = context.getString(R.string.app_name); String message = "時間が経過しました"; NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // Notification Channel 設定 NotificationChannel channel = new NotificationChannel( channelId, title, NotificationManager.IMPORTANCE_HIGH); channel.setDescription(message); channel.enableVibration(false); // フルスクリーン用 Intent fullScreenIntent = new Intent(context, StopActivity.class); PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(context, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT); if (notificationManager != null) { notificationManager.createNotificationChannel(channel); Notification notification = new NotificationCompat.Builder(context, channelId) .setContentTitle(title) // 設定されるタイトル .setSmallIcon(android.R.drawable.ic_lock_idle_alarm) // 通知に表示されるアイコン .setContentText(message) // 本文テキスト .setAutoCancel(true) // タップすると通知が消去 .setWhen(System.currentTimeMillis()) // タイムスタンプ .setFullScreenIntent(fullScreenPendingIntent, true) .setCategory(NotificationCompat.CATEGORY_CALL) .build(); // 通知 notificationManager.notify(R.string.app_name, notification); } } }
java
public class StopActivity extends AppCompatActivity { SoundPool _soundPoolFinish; int _sound; public enum soundState { // 列挙型により音声の定義 START, STOP } Vibrator _vibrator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stop); Intent intent = getIntent(); try { // タイマーストップボタンのリスナ作成 Button bt_timer = findViewById(R.id.bt_stop); StopActivity.HelloListener listener = new StopActivity.HelloListener(); bt_timer.setOnClickListener(listener); // 以下音声設定 AudioAttributes attributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_GAME) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .build(); _soundPoolFinish = new SoundPool.Builder() .setAudioAttributes(attributes) .setMaxStreams(2) .build(); _sound = _soundPoolFinish.load(this, R.raw.timer, 1); // Thread.sleep(500); // 音声スタート _soundPoolFinish.play(_sound, 1.0F, 1.0F, 0, 0, 1.0F); // バイブレーションを鳴らす AudioAttributes audioAttributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ALARM) .build(); _vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); VibrationEffect ve = VibrationEffect.createWaveform(new long[]{0, 1000, 500, 1000, 500, 1000}, VibrationEffect.DEFAULT_AMPLITUDE); _vibrator.vibrate(ve, audioAttributes); } catch (InterruptedException e){} } /** ボタンを押したら振動と音とめて終了 */ private class HelloListener implements View.OnClickListener { @Override public void onClick(View view) { int id = view.getId(); switch (id) { case R.id.bt_stop: _soundPoolFinish.stop(_sound); _vibrator.cancel(); finish(); break; } } } }
xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test"> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Test"> <activity android:name=".StopActivity" android:showWhenLocked="true" android:turnScreenOn="true"></activity> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".AlarmManagerTest" /> </application> </manifest>
まだ回答がついていません
会員登録して回答してみよう