AlarmManagerが複数のデバイスで機能しない


85

私のアプリはAlarmManagerを使用しており、4年前から機能しています。しかし、一部のデバイスで失敗し始めたことに気づきました。

コードは正しいと確信しています(Dozeを搭載したデバイスにはWakefulBroadcastReceiverとsetExactAndAllowWhileIdleを使用しています)。Nexusデバイスでは完全に機能しますが、一部のメーカー(Huawei、Xiaomi ...)のデバイスでは失敗します。

たとえば、Huaweiデバイスには、アプリを強制終了する一種のバッテリーマネージャーがあり、アプリが強制終了されると、スケジュールされたアラームがキャンセルされます。そのため、Huaweiバッテリーマネージャーでアプリを「保護」に設定すると、問題が解決します。

しかし最近、Xiaomi、Samsung(おそらく新しい「SmartManager」に関連しているのでしょうか?)など、より多くのデバイスで動作していないことに気付きました...この動作は標準になりつつあるようです:バックグラウンドアプリを強制終了します。

誰かがそれについて何か知っていますか?アラームが鳴ることを確認する方法はありますか?

編集:この問題は、さまざまなメーカーによって追加された「バッテリーセーバー」が原因で発生します。詳細はこちら:https//dontkillmyapp.com/


8
メーカーはアプリの消費電力を非難し、コアの少ないCPUと比較してバッテリーを多く消費するオクタコアのマーケティングを続けています。彼らは、コアを追加するだけで電話がスピードアップすると思いますか?
FrozenFire 2016年

1
@AviLevinshtein多分私はあなたの質問を誤解しました。アクティビティでアラームを作成しています。次に、アラームが鳴ると、ブロードキャストレシーバーが実行され、最後にWakefulIntentService(@commonswareのクラス)が実行されます。
Sergio Viudes 2016年

2
@JFValdes私はまだ解決策を探しています。AlarmManagerは、VanillaAndroidを搭載したデバイスで完全に機能しています。問題は、メーカーがAndroidの機能を「強化」しようとしていて、AlarmManagerを壊してしまったことです...メーカーは独自の「バッテリーセーバー」を実装すべきではありません。標準のDozeモードを使用している場合、AlarmManagerは完全に機能します...解決のための...
セルジオViudes

1
まだ解決策はありますか?リマインダーなどの他のアプリはどのようにそれを行いますか?setAlarm以外のオプションが必要です。これは、リマインダーではなくアラーム用です
kv1dr 2016

1
@SergioViudes私も追跡用のXiomiデバイスで同じ問題に直面しています。そして、次の設定を行うことで、4つのデバイスのうち3つで正しく動作するよりもバッテリー節約の制限からアプリを除外する場合--->バッテリーに移動->電源->アプリのバッテリーセーバー->アプリ制限なし(背景設定の場合)、背景の場所のオプションを許可
Imran Khan Saifi 2016

回答:


17

私はすでに数週間それを解決しようとしています。何も見つかりませんでした。Huaweiは、しばらくするとすべてのアラームを強制終了します。バッテリーセーバーの保護されたアプリにアプリを配置しても、役に立ちません。ただし、アプリのパッケージ名を変更して、アラーム、時計、カレンダーなどの単語を含めると、他のデバイスと同じように正常に機能します。Googleがこのがらくたを認証する方法がわかりません。OEMはコアプラットフォームをそのように変更すべきではないと思います。ユーザーが使用しない場合、しばらくするとアプリを強制終了する独自のバッターセーバーがあることを理解しています。しかし、これは保護されたアプリの殺害警報でもあります。

また、正確なタイミングアラームのsetAlarmClock()が役立ちます。しかし、これをウィジェットの更新のような考えに使用することはできません。

更新:パッケージ名キーワードによる保護は、現在のHuaweiデバイスではすでに機能していません。2017年にはそうでした。


私と同じように、私もそれを試しますが、いくつかのブランドXiaomi、Oppo、Huaweiでこの問題を解決する方法はありません。彼らは時々バッテリーを節約するためにバックグラウンドプロセスとアラームを殺します。
Andi Susilo 2017年

1
私はhuaweiの電話を持っていますが、パッケージ名をアラーム/カレンダーに変更しても何も起こりません。これを回避する唯一の方法は、電話マネージャーから保護されたアプリリストにアプリを追加する
Ashish Pardhiye 2017

9

問題はSmartManagerです。Samsungにはバッテリーマネージャーがあり、特定のアプリをバックグラウンドで実行できない場合があります。アプリに戻るときに「再開」しようとしましたが、アプリケーションを完全に無効にするか、5分ごとに再開する場合があります(Samsungの方法によって異なります)。

Samsung Managerがないため、これはAndroidのストックバージョンで機能します。SMを有効にするいくつかの機能を備えたカスタムバージョンのAndroidをインストールすることもできます(ROMによって異なります)。


私はそれをテストするためのSamsungデバイスを持っていないので私は夢中になっています。私は自分のアプリのユーザーが私に言っていることしか知りません。アプリが強制終了されたためにAlarmManagerが機能しないことが問題であるかどうかを知っていますか?または、そのマネージャーが原因でアラームが鳴ったときにデバイスがウェイクアップできないという問題がありますか?
Sergio Viudes 2016年

@SergioViudes最近、多くの企業が独自に実装しています。LGのようにサムスンと同じように機能するものがあります、多分あなたの電話はそれを持っていますか?問題はアラームではなく、アラームアプリが完全に非アクティブな状態にプッシュされます。Smart Managerは、あなたが必要としない単なるランダムなアプリだと考えています。特定のアプリがそれを乗り越えることができることに気づきました。おそらく、一部のアプリはスマートマネージャーによって受け入れられます。
SA

1
@SergioViudes私はテストするサムスンを持っています、そしてあなたがそれから得ることができる多くはないとあなたに言うことができます。スマートマネージャーがアプリを最適化すると、エラーなどは発生せず、強制停止と同様に停止します。それはまだ最近のアプリのリストにあります
ティム

ティムに感謝します。「スマート」マネージャーからアプリを除外せずに、この問題を解決できると便利です。
Sergio Viudes 2016

xiaomi(miui)、vivo、htcなどのデバイスは、自分で判断しているように見える「信頼できる」アプリのリストにあるアプリ(whatsapp、truecallerなどがデフォルトで信頼されている)でない限り、デフォルトですべての権限をfalseに設定します)。これはコーダーの悪夢になりつつあります
desidigitalnomad 2017

4

最新のAndroidデバイスのほとんどには、バッテリーを節約する方法を自動的に見つけようとするアプリまたはメカニズムが付属しており、その結果、特定のサードパーティアプリが強制終了される可能性があります。これにより、スケジュールされたタスクとジョブが削除される可能性があります(たとえば、アラームが鳴らない、プッシュ通知が機能しないなど)。多くの場合、これはAndroidのバッテリー節約メカニズムとは完全に独立して発生します。私の場合、一部のデバイスモデルを検出すると、バッテリーの最適化をこれ以上行うことができませんでした。ユーザーをスタートアップマネージャーにリダイレクトして、アプリケーションをホワイトリストに登録します。

このリンクで、すべてのモデルについて、https://android-arsenal.com/details/1/6771を呼び出す必要があることがわかりました


2

5.0未満のデバイスにはAlarmManagerを使用し、5.0以上のデバイスにはJobSchedulerを使用します。JobSchedulerがメーカーのシェナニガンの影響を受けないかどうかは定かではありませんが、Androidが人々をAlarmManagerからJobSchedulerに移動させようとしていることを考えると、私にはそうは思えません。

編集:Googleは、WorkManagerと呼ばれるこの問題に対するファーストパーティのソリューションを発表しました。複数のスケジューリングフレームワークを抽象化し、デバイスに最も適切なものを使用します。


2
残念ながら、AlarmManagerクラスとは異なり、JobSchedulerを使用する場合のタイミングは正確ではありません。私のアプリでは、タイミングは正確である必要があります:(
Sergio Viudes 2016年

私はそれを試してみましたが、一部のオプティマイザー(少なくともsamsung)は、画面が消えたときにJobSchedulerで保留中のすべてのタスクを強制終了します。だからそれも壊れています。これは5.0で発生します。6.0にアップデートした後は正常に動作しますが、修正されたと思います。まだ他のメーカーでテストすることはできませんでした。
Sloy 2016

正確なタイミングのために、バックグラウンドサービスまたはスケジュールされたサービスを使用することはできません。フォアグラウンドサービスを試すこともできますが、これによりユーザーに永続的な通知が作成され(おそらく望ましくない)、一部の電話にはタスクキラーが組み込まれており、フォアグラウンドサービスが自動的に破棄されます。WorkManagerが最善のソリューションですが、残念ながら正確なタイミングはわかりません。
トム

1

アラームを設定するアプリもあります。解決策は、API> = 21でAlarmManager.setAlarmClock()を使用することです。これはdoze afaikの影響を受けず、システムトレイに目覚まし時計アイコンを配置するという追加のボーナスがあります。


ご回答有難うございます。目覚まし時計のアイコンを削除する方法はありますか?
Sergio Viudes 2016年

残念ながら、setAlarmClockが機能しない場合があります。低メモリのOreoデバイスでテストしました。
ボリスサリモフ

1

これは遅いかもしれませんが、誰かに役立つことを願っています。

私は長い間同じ問題に悩まされていました。しかし今、私はこの問題を解決する方法を知っています。これは、同じ問題を抱えている可能性のある人を対象としています。AutoStartを有効にする必要があると人々は言い続けます私は自動起動を使用してでそれを管理します。

まず、WakeFullBroadcastaReceiverは非推奨になり、BroadcastReceiverを使用する必要があります。次に、BackgroundServiceの代わりにForegroudServiceを使用する必要があります。

以下に例を示します。

IntentService.class

public class NotificationService extends IntentService {


//In order to send notification when the app is close
//we use a foreground service, background service doesn't do the work.



public NotificationService() {
    super("NotificationService");
}

@Override
public void onCreate() {
    super.onCreate();

}

@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    //There is no difference in the result between start_sticky or start_not_sticky at the moment
    return START_NOT_STICKY;
}

@Override
protected void onHandleIntent(@Nullable Intent intent) {

    //TODO check if the app is in foreground or not, we can use activity lifecyclecallbacks for this

    startForegroundServiceT();
    sendNotification(intent);
    stopSelf();
}


/***
 * you have to show the notification to the user when running foreground service
 * otherwise it will throw an exception
 */
private void startForegroundServiceT(){

    if (Build.VERSION.SDK_INT >= 26) {
        String CHANNEL_ID = "my_channel_01";
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_DEFAULT);

        ((NotificationManager) 
   getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);

        Notification notification = new Notification.Builder(this, CHANNEL_ID)
                .setContentTitle("")
                .setContentText("").build();

        startForeground(1, notification);
    }
}

private void sendNotification(Intent intent){

    //Send notification
    //Use notification channle for android O+
}
}

BroadcastReceiver.classでフォアグラウンドサービスを開始します

public class AlarmReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {


    Intent service = new Intent(context, NotificationService.class);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        context.startForegroundService(service);
    } else {
        context.startService(service);
    }

}
}

そして、このようなsetAlarms:

 public static void setAlarm(Context context, int requestCode, int hour, int minute){


    AlarmManager alarmManager =( AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context//same activity should be used when canceling the alarm
            , AlarmReceiver.class);
    intent.setAction("android.intent.action.NOTIFY");

    //setting FLAG_CANCEL_CURRENT makes some problems. and doest allow the cancelAlarm to work properly
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1001, intent, 0);

    Calendar time = getTime(hour, minute);

    //set Alarm for different API levels
    if (Build.VERSION.SDK_INT >= 23){
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pendingIntent);
    }
    else{
        alarmManager.set(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pendingIntent);
    }

次に、マニフェストでレシーバーとフォアグラウンドサービスを宣言する必要があります。

       <receiver android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.NOTIFY">

            </action>
        </intent-filter>
    </receiver>
    <service
        android:name=".NotificationService"
        android:enabled="true"
        android:exported="true"></service>

これが誰かの助けになることを願っています。


しかし、誰も賛成票を投じていませんか?@ keivan.k
グムル

0

最近のほとんどの新しい電話には、あなたが説明したのと同じことをするある種のバッテリー/省電力マネージャーがバンドルされています。デュブースターとクリーンマスターは数えません。

アプリ/ Playストアのリストに免責事項またはよくある質問を記載して、このアプリを正常に動作させるにはバッテリーマネージャーアプリを除いて配置する必要があることを示す必要があると思います。


それを行う別の方法があるはずです...ユーザーは免責事項を読むことはありません。私は...サムスンの携帯電話はアプリがAlarmManagerを使用することを許可しないことを考えることはできません
セルジオViudes

アラームは「時間どおりに」発火しませんが、最終的には発火します
Gavriel

これは(悲しいことに)最も役立つ答えだと思います。より良い解決策があればいいのにと思いますが、ハードウェアメーカーは完全に機能するバニラAndroidに損害を与えています。
caw 2016年

0

しばらく前にAlarmManagerの使用をやめました...より良く、より安定した代替手段

  1. サービスを作成する
  2. BroadcastReceiverをBOOT_COMPLETEDに登録します
  3. 受信者からサービスを起動します
  4. X分ごとにループするサービス内の新しいハンドラーを開始します(Android-postDelayed()呼び出しを使用してメソッドを定期的に実行します
  5. タスクを実行する時間が来たかどうかを確認します:now-実行時間> 0(Javaで2つの日付の差の期間を見つける方法は?
  6. もしそうなら..タスクを実行し、ハンドラーを停止します

はい..それは苦痛です..しかし、仕事は何の問題もありません


3
提案に感謝しますが、AlarmManagerを使用してもRAMやリソースを消費しないため、このアプローチは避けたいと思います。そして、あなたのアプリが殺されると、サービスは停止しますよね?
Sergio Viudes 2016年

このアプローチがBOOLETPROOFであるとは言いませんでしたが、少なくとも異なるapiバージョンで構成されています:)
ymz 2016年

1
確実に機能するためには、このソリューションはおそらくウェイクロックも使用する必要があり、それは大量のバッテリーを消費します。
パヴェルNadolski

私はあなたがこれに正しいと思います..唯一の質問は:最悪のことは何ですか-信頼できないコードまたは悪いパフォーマンス?とにかく、私は個人的に、場合によっては適切かもしれないロックの代替方法があると思います(例えば:stackoverflow.com/questions/5346694/…
ymz 2016

しかし、主要なメカニズムであるBroadcasrecieverは\
NoorHossain20年

0

BOOT_COMPLETEDをリッスンしていますか?デバイスの再起動時にアラームを再設定する必要があります。


はい。私が言ったように、アラームは2012年から現在まで機能していました。デバイスが再起動されると、BOOT_COMPLETEDブロードキャストレシーバーでアラームを再スケジュールします。
Sergio Viudes 2016年

1
アプリが再び機能するために再起動を要求することは、解決策の半分でもありません
Tim

1
@TimCastelijnsそれは私が言っていることではありません。デバイスを再起動した場合は、アラームマネージャで設定されたすべてのアラームを再設定する必要があります。
Tyler Pfaff 2016

@TylerPfaffはい、しかしデバイスの再起動はこの質問の問題とは関係ありません
Tim

0

これらのデバイスはどのバージョンのAndroidを実行していますか?

API 23以降、OS自体は、しばらく使用されていない場合、低電力アイドルモードになり、そのモードではアラームは配信されません。ただし、アプリが「バッテリーの使用量に関係なく、この時点でこのアラームを鳴らす必要がある」と明示的に言う方法があります。新しいAlarmManager方法が呼ばれるsetAndAllowWhileIdle()setExactAndAllowWhileIdle()

あなたの説明から、これは特定のOEMのデバイスでの問題の特定の原因ではないように思われますが、これは、AlarmManagerを使用するすべての開発者が知っておくべきことです。

最後に、Alarm Managerの多くの使用法は、JobSchedulerのメカニズムを使用してより適切に対処されます。後方互換性のために、Play開発者サービスの「GCMネットワークマネージャー」は、実際には機能的にジョブスケジューラに非常に近く、新しいバージョンのAndroidでは内部的にジョブスケジューラを使用します。クラスの名前にかかわらず、必ずしもネットワークに関するものではありません。


SmartManagerを搭載したSamsungデバイスはLollipopを実行しています。私はすでにマシュマロデバイスにsetExactAndAllowWhileIdleを使用しています。JobSchedulerとGCMを見てみましょう。とにかく、問題がアラームが鳴らないことなのか、それともアラームが鳴ったときにそのデバイスが目覚めないのかはわかりません。
Sergio Viudes 2016年

0

アプリを強制終了しても、アラームマネージャーがアプリをスリープ解除するのを防ぐことはできないと思います。

アプリを「強制停止」または無効にした場合にのみ、アラームマネージャーからのコールバックは受信されません。

根本的な原因は別のものである可能性があります。

また、Mでは... setExactAndAllowWhileIdleはスロットルを実行します...つまり、2分ごとにアラームをスケジュールした場合、アラームはトリガーされません。..15分のウィンドウが必要です。。


1
ご回答有難うございます。しかし、そうでない場合、Smart Managerで「バッテリーの最適化」が無効になっているときにアプリが完全に機能するのはなぜですか?
Sergio Viudes 2016年

あなたは...アプリマネージャがあまりにもアプリを無効にすることができそうdevice..if根ざした上でアプリケーションを実行している
rupeshジャイナ

いいえ、root化されたデバイスでは実行していません。
Sergio Viudes 2016年

@rupeshjain「つまり、2分ごとにアラームをスケジュールすると、アラームはトリガーされません。..15分のウィンドウが必要です。」これは完全に真実ではありません、それが真実であるならば、それは本当の問題です。setExactAndAllowWhileIdleメソッドのAndroidドキュメント内でスケジュールするための時間制限を正確に読み取ることができます。特定のアプリケーションでこれらのアラームが鳴る頻度には制限があります。通常のシステム操作では、低電力アイドルモードでこの期間が15分より大幅に長くなる可能性がある場合、これらのアラームは約1分ごとにディスパッチされません。
eyadMhanna

0

Xiaomiの場合、アプリでAutoStartを有効にする必要がある場合があります。バックグラウンドプロセスに影響を与える可能性のあるAndroidの変更(通常は電話の製造元から)のリストを作成しようとしています。あなたが何か新しいものを持っているなら、ここに答えを追加してくださいAndroidタスクキラーのリスト


0

アプリマネージャーの自動起動マネージャーでアプリを有効にする必要があります。vivov5などの一部の携帯電話は

In vivo v5では、このメニューはiManager-> App Manager-> Auto StartManagerにあります。ここでアプリを有効にします。

次に、アプリが強制終了または閉じられた場合、アラーム/アラームマネージャーがアラームをトリガーします。


0

私は答えを探していました、そして数時間後に私はこれを見つけました:

https://stackoverflow.com/a/35220476/3174791

履歴書では、アプリが「保護されたアプリ」によって強制終了されたかどうかを知る方法であり、これはHuaweiデバイスでのみ機能します。他のデバイス(Samsung、Sony、Xiaomiなど)の解決策があるかどうか教えてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.