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

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

ただいまの
回答率

89.98%

スリープ中に起動されるアクテイビティの起動時間がずれる

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 512

hashimoyakumo

score 11

現在、アラームを作成しています。
Broadcast receiverを通して起動時間になるとスリープと画面ロックを解除しアラームのアクテイビティが起動して
notificationを通知しアラームが鳴るようになっているのですが端末が長い時間スリープ状態(5時間ぐらい?)
になるとnotificationは通知されるのですがアクテイビティが立ち上がらないあるいは遅れて立ち上がる(5~10分ぐらい)現象が発生します。機種本体にパスコードをかけてるのが問題なのかと思ったのですが他のアラームアプリはちゃんと動くので原因がよくわかりません。
お知恵をお貸しください。よろしくお願いします。

環境は
機種 Zenfone 3 Laser 
android ver 7.1.1.1
となっています。

また、本機種の省電力設定から当アプリを除外しています。

下記に設定した時間になった際に起動するアクテビティのソースコードを掲載させていただきます。(一部関係のない部分は消去しています)
ここのwakeFromSleep()でスリープの解除や画面のロックを解除しています。

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import java.util.Locale;

public class Alarm_vib extends Activity {
    //スリープ解除用関数
    private KeyguardManager.KeyguardLock keylock;
    private PowerManager.WakeLock wakelock;
    //ローカライズ用変数
    Locale locale = Locale.getDefault();
    //変数の宣言
    private LoopEngine loopEngine = new LoopEngine();//ハンドラ用
    //チェックボックス状態保存
    private Integer[] user_chkbox_status=new Integer[7];
    //グローバル変数の設定
    MyApplication MyGlobal;
    //コンテキスト設定
    Context context;
    PendingIntent pending;
    AlarmManager am;
    //テキストビュー宣言
    TextView local_textview;
    //変数
    URL url;
    private static final String TAG = "MainActivity";
    //アラームのポジション
    private int position_alarm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.vib_layout);
        //広告
        //スリープの解除
        wakeFromSleep();
        loopEngine.start();
        //グローバル変数の取得
        MyGlobal = (MyApplication) this.getApplication();
        context=MyApplication.getAppContext();
        //GLOBALの初期化
        MyGlobal.MyapplicationAllInit();
        //レイアウトの関連付け
        //壁紙の取得とはLinearLayoutへの設定
        //全体レイアウトの関連付け
        LinearLayout Entire_layout =(LinearLayout) findViewById(R.id.Entire_layout);
        WallpaperManager wpm = WallpaperManager.getInstance(getApplication());
        Drawable wallpaper = wpm.getDrawable();
        Entire_layout.setBackground(wallpaper);
        //遷移前のインテントの受け取り
        Intent intent_Alarm_Variable =getIntent();
        //アラームの再設定
        final int position=intent_Alarm_Variable.getIntExtra("SET_ALARM_POSITION",0);
        position_alarm=position;
        //ボタン
        final Button btn = (Button) findViewById(R.id.stop_button);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                loopEngine.stop();
                //アラームの再セット
                Alarm_set();
                //アプリの終了
                keylock.reenableKeyguard();
                finish();
            }
        });
    }
    //スリープ解除関数
    private void wakeFromSleep() {
        wakelock = ((PowerManager) getSystemService(android.content.Context.POWER_SERVICE))
                .newWakeLock(PowerManager.FULL_WAKE_LOCK
                        | PowerManager.ACQUIRE_CAUSES_WAKEUP
                        | PowerManager.ON_AFTER_RELEASE, "disableLock");
        wakelock.acquire();
        wakelock.release();
        //ロック解除
        KeyguardManager keyguard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        keylock = keyguard.newKeyguardLock("disableLock");
        keylock.disableKeyguard();
    }
//一定時間後にupdateを呼ぶためのオブジェクト
class LoopEngine extends Handler {
    private boolean isUpdate;
    public void start() {
        this.isUpdate = true;
        handleMessage(new Message());
    }
    public void stop() {
        this.isUpdate = false;
    }
    //バイブレータ
    public void update()
    {
        Vibrator vibrator = (Vibrator) MyApplication.getAppContext().getSystemService(VIBRATOR_SERVICE);
        vibrator.vibrate(1000);
    }
    @Override
    public void handleMessage(Message msg) {
        this.removeMessages(0);//既存のメッセージは削除
        if (this.isUpdate) {
            this.update();//自信が発したメッセージを取得してupdateを実行
            sendMessageDelayed(obtainMessage(0), 1000);//1000ミリ秒後にメッセージを出力
        }
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる