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

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

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

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

Android Studio

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

解決済

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

tokoroten_12
tokoroten_12

総合スコア24

Java

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

Android Studio

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

2回答

0評価

0クリップ

467閲覧

投稿2022/03/14 02:30

編集2022/03/22 13:56

開発・デバッグ環境

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>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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 の内容を教えていただけますでしょうか。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Android Studio

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