2016-11-25 12 views
0

docsの後、私はAlarmManagerを使用してアラームを設定しましたが、これは電話の画面をオフにしないとうまく動作します。AlarmManager:画面をオフにしたときに保留中のインテントが削除されました

これは、画面が上にあるadb shell dumpsys alarmの出力です:

Batch{1304da7 num=1 start=190708622 end=190708622 flgs=0x1}: 
    RTC_WAKEUP #0: Alarm{f642254 type 0 when 1480059825231 alarm.poc.app} 
     tag=*walarm*:alarm.poc.app.ACTION 
     type=0 whenElapsed=+5m49s424ms when=2016-11-25 02:43:45 
     window=0 repeatInterval=0 count=0 flags=0x1 
     operation=PendingIntent{f78d3a6: PendingIntentRecord{f52e1e7 alarm.poc.app broadcastIntent}} 

秒のカップル私は私のアラームをオフ画面をオンにした後、コマンド出力から消え、呼び出されることは決してありません(それはスクリーンで動作しますに)。生きているアラームを維持するために行う、他にどのようなアプリを

  • は、だから私は、これらの質問がありますか?adb shell dumpsys alarmの出力で、最近のすべてのアプリを消去しても、他のアラームが削除されていないことがわかります。私はWhatsapp、Google、そして他の多くのランダムなアプリのアラームを見ることができます。

  • これらのアプリはすべてフォアグラウンドサービスを持っていますか? 5秒ごとにログに何かを書き込む厄介なフォアグラウンドサービスを作成して問題を「回避する」ことができたので、私はこれを尋ねます。実行中のサービスが問題を防止するように見えるが、それは完全に醜いので、プロセッサを常に目を覚ますようにするのは良い考えではないと思う。

これは私のセットアップアラーム方法です:

public void onReceive(Context context, Intent receivedIntent) { 
    if (MY_ACTION.equals(receivedIntent.getAction())) { 
    System.out.println("good!!!"); 
    String text = receivedIntent.getStringExtra("text"); 
    Intent intentService = new Intent(context, TestService.class); 
    intentService.putExtra("text", text); 
    startWakefulService(context, intentService); 
    System.out.println("service started"); 
    } 
} 

とマニフェスト:

... 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
... 
    <service android:name="alarm.poc.app.TestService" 
     android:exported="false"/> 

    <receiver android:name="alarm.poc.app.AlarmReceiver" 
      android:process=":remote"> 
    <intent-filter> 
     <action android:name="alarm.poc.app.ACTION"/> 
    </intent-filter> 
    </receiver> 
... 

AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);  
Intent intent = new Intent(AlarmReceiver.MY_ACTION); 
intent.putExtra("text", editText.getText().toString()); 
PendingIntent pending = PendingIntent.getBroadcast(this, 42, 
    intent, PendingIntent.FLAG_UPDATE_CURRENT); 
// also tried with getBroadcast(this, 0, intent, 0) 
manager.setExact(AlarmManager.RTC_WAKEUP, millis, pending); 

は私が持っている(画面オフの状態で呼び出されていない)WakefulBroadcastReceiver

私はmarshmallow電話、minSdkVersion 19とtargetSdkVeでテストしていますrsion 24

答えて

1

私の質問に対する答えが見つかりました。

私はHuaweiの携帯電話でテストしており、保護されるように設定されたものを除き、画面が消えたときにすべてのアプリを殺す「Protected Apps」機能が付属しています。

dumpsysの出力に他のアプリがたくさんある理由は、Huaweiが既定で、すでに人気のあるアプリを「保護」しているためです。

私が見つけた唯一の解決策は、Huaweiの携帯電話を検出し、アプリを保護するためにユーザーに尋ねることです。この答えは、そのアプローチを説明します。

"Protected Apps" setting on Huawei phones, and how to handle it

1

あなたは、アラームを受信したときにデバイスを起動するのにWakeLockerを使用する必要があります。

package your.packagename; 

import android.content.Context; import android.os.PowerManager; 

public abstract class WakeLocker { 

    private static PowerManager.WakeLock wakeLock; 

    public static void acquire(Context ctx) { 
    if (wakeLock != null) wakeLock.release(); 

    PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); 
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
      PowerManager.ACQUIRE_CAUSES_WAKEUP | 
      PowerManager.ON_AFTER_RELEASE, MainActivity.APP_TAG); 
    wakeLock.acquire(); 
    } 

    public static void release() { 
    if (wakeLock != null) wakeLock.release(); wakeLock = null; 
    } 
} 

と第一のものとしてあなたの受信機の呼び出しWakeLocker.acquire(context);中:このソースコードにWakeLockerと呼ばれる新しいクラスを作成します。余分に:それはまたあなたの警報がそれをしたらWakeLocker.release();を呼出すことはきちんとである。

また、許可が必要です:<uses-permission android:name="android.permission.WAKE_LOCK" />

関連する問題