9

は、私は携帯電話の通知をリッスンし、MessageApiを経由してAndroid Wear端末にメッセージを送信するアプリを持っています。 Android 6、特にHuawei Mate 8(Huawei Android 6のすべてがそうしているように見える)を搭載したデバイスを除いて、すべてがうまくいきます。NotificationListenerServiceとDozeモードとAppスタンバイ

Huawei社は、アプリのバックグラウンド処理(保護されたアプリ)凍結の独自の実装を有しています。ユーザーのレポートから、私のアプリケーションはHuaweiの保護されたアプリケーションとAndroid 6のDozeモードで例外があることを確認しました。アプリは正常に動作しますが、ディスプレイをオフにして正確に15分後に、接続しているAndroid Wearの時計にメッセージを送信しなくなります。私のアプリは、受信した通知履歴を記録することもできます。電話のディスプレイがオンになり、アプリが開かれるまで、15分後に到着するものはありません。その後、携帯電話のディスプレイがオフになっている間に到着したはずのすべての通知が私のNotificationListenerService実装に届き、すべて一度に時計に送信されます。これは記録された履歴でも確認されます。

任意のアイデアどのようにDozeモードとAndroidの6とこれらの携帯電話、特に華為メイト8のためにこれを修正するには?デバイスが居眠りモードになっているおよび/またはアプリがスタンバイモードのときに

NotificationListenerServiceの正しい振る舞いとは何ですか?

EDIT

また、ユーザーは自分の携帯電話でもバックグラウンドのアプリとそれらのサービスに影響を与え省電力モードになっていないことを確認しています。このバグはHuaweiのように見えます.Nexusのユーザーはこれを報告しておらず、OnePlus One with Mもこれをしていないからです。また、NプレビューはNexus端末でうまく動作します。

EDIT 2

私は私のアプリは、このように私のアプリは、すべての電池の最適化から除外すべき通知センターで永久的な通知を、持っているオプションのフォアグラウンドサービス(startForeground())を追加しました。フォアグラウンドサービス通知では、私はNotificationCompat.PRIORITY_MINの優先度を使用し、Notification.FLAG_ONGOING_EVENTフラグを追加しました。これはHuaweiの携帯電話では少し助けましたが、私のアプリを開いた後ではなく、画面がオンになった直後に通知が遅れてNotificationListenerServiceに届きました。私はstartForeground()を私のNotificationListenerServiceに使用していませんが、別のServiceには私はそのライフサイクルについてのコントロールがないので使用しません。

答えて

0

私はあなたのポストを見てまで、私はAndroidのDozeモードについては知りませんでした。それから私はthis articleを読んで、それはそれが働くことになっている方法ですね! Dozeモードで通知を取得する場合は、通知優先度にPRIORITY_HIGHまたはPRIORITY_MAXを使用してみてください。ただし、動作しても記事では完全な解決策のようには思えません。 Huawei社のデバイス(すべてのHuawei社のデバイスに適用されるかどうかわからない)については

+0

記事は、プッシュ通知ではなくローカルの通知についてです:誰もが知っている場合:)

リファレンスを共有してください。私は自分のアプリケーションのためのサーバーを持っていない、それは完全にオフラインですので、私は高優先度のプッシュ通知を介して電話を目覚めることはできません。その電話機に通知が表示されたときにプッシュ通知を電話機に送信することも不可能です... – shelll

+0

この記事によれば、デバイスを復帰させることはできません – NecipAllef

2

、あなたはそれがバックグラウンドになったときにアプリが凍結されないようにするために保護されたアプリの許可を要求する必要があります。Huawei社のデバイスは、アプリの許可を保護しているかどうかを検出するために

private boolean hasProtectedAppsSetting() { 
    Intent intent = new Intent(); 
    intent.setClassName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"); 

    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
      PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 

をHuawei社を起動するには、アプリの設定ページを保護:

private void showProtectedAppsSetting() { 
    try { 
     String cmd = "am start -n com.huawei.systemmanager/.optimize.process.ProtectActivity"; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      cmd += " --user " + getUserSerial(); 
     } 
     Runtime.getRuntime().exec(cmd); 
    } catch (IOException ignored) { 
    } 
} 

private String getUserSerial() { 
    //noinspection ResourceType 
    Object userManager = getSystemService("user"); 
    if (null == userManager) return ""; 

    try { 
     Method myUserHandleMethod = android.os.Process.class.getMethod("myUserHandle", (Class<?>[]) null); 
     Object myUserHandle = myUserHandleMethod.invoke(android.os.Process.class, (Object[]) null); 
     Method getSerialNumberForUser = userManager.getClass().getMethod("getSerialNumberForUser", myUserHandle.getClass()); 
     long userSerial = (Long) getSerialNumberForUser.invoke(userManager, myUserHandle); 
     return String.valueOf(userSerial); 
    } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException ignored) { 
    } 
    return ""; 
} 

残念ながら、私は、ユーザーかどうかを確認する方法を発見していませんでしたあなたのアプリを保護されたアプリケーションとして許可しました。 http://ndroid.info/ldquo_protected_appsrdquo_setting_on_huawei_phones_and_how_to_handle_it

+0

ありがとうございます。しかし、問題で述べたように、問題は、HuaweiのProtected Appsで私のアプリケーションに例外を与えても、 "バックグラウンドフリーズ"は解決されないということです。 Android 6のネイティブバッテリー最適化機能とフォアグラウンドサービスを無効にしても。一部のユーザーにとっては、保護されたアプリケーションとバッテリーの最適化の両方に例外を追加するだけで十分ですが、すべてではありません。大部分でさえも。 – shelll

関連する問題