web-dev-qa-db-ja.com

Android Oreo永続通知「アプリはバックグラウンドで実行されています」

私はAndroidアプリ開発者であり、インスタントメッセージアプリを開発しています。アプリにAndroid Oreoシステムで通知の問題があり、永続的な通知が表示されます "アプリはバックグラウンドで実行されています」とクリアできず、Android Oreoより前のシステムでは問題ありません。

スクリーンショット:電話は永続的な通知アプリがバックグラウンドで実行されていることを示しています

この質問に関するNexusヘルプフォーラム などのディスカッションが見つかりましたが、電話の設定では機能しません。

この通知をプログラムで非表示にする方法を知りたいのですが、インスタントメッセージアプリであるため、アプリはメッセージを即座に受信することもできます。

どんな助けでも大歓迎です。

6
Smiles

アプリにAndroid Oreoシステムで通知の問題があり、「アプリはバックグラウンドで実行されています」という永続的な通知が表示され、クリアできません。Androidオレオ。

startForeground()を最小重要度Notificationで使用しました。

この通知をプログラムで非表示にする方法を知りたい

startForeground()を最小の重要度よりも高いNotificationとともに使用します。または、startForeground()を使用しないでください。

WeChatなどのインストールメッセージアプリがいくつか見つかりました。Facebookではこの問題は発生しませんAndroid Oreo

彼らはおそらくフォアグラウンドサービスを使用していません。たとえば、Firebase Cloud Messaging(FCM)を使用している可能性があります。

4
CommonsWare

ただし、それを取り除く方法について説明する前に、そもそもなぜそこにあるのかについて説明しましょう。

基本的に、Androidの以前のバージョンでは、アプリがバックグラウンドで実行されているかどうかを知る実際の方法はありませんでした。ほとんどのシナリオでは、これらの誤動作するアプリは、システムをスリープ状態にしないことでバッテリーに大混乱をもたらします。これらは「ウェイクロック」と呼ばれます。素人の言葉で言えば、それはシステムが眠らないようにすることでした。それは良くないね。

Googleは、Oreoを使用して、新しい通知でアプリにこの種のことを実行させる開発者を呼びかけています。基本的に、アプリがバックグラウンドで実行されていて、バッテリーの寿命を縮めている場合、この新しい通知で通知されます。

注:VPNサービスの実行など、アプリがバックグラウンドで継続的に実行される正当なシナリオがいくつかあります。ただし、多くの場合、アプリは不当にバックグラウンドで実行されています。

ただし、通知を削除しても問題は解決しないことに注意してください。限目。この通知が存在するのには理由があり、それを取り除いても根本的な問題を解決することはできません。アプリ内の設定を変更するか、アプリを完全にアンインストールする必要があります。

それを理解し、それでも削除したいのであれば、これを実行しましょう。これは比較的重要なシステム設定であるため、Oreo自体の中でそれを削除する方法はありません。それは理にかなっている。

しかし、ほとんどの場合と同様に、開発者コミュニティはそれを削除する方法を見つけ、開発者iboalaliはまさにそれを行うためのアプリをリリースしました。これは実際には「非表示の「バックグラウンドで実行中」の通知」と呼ばれ、アプリ名と同じくらい簡単です。先に進んで、インストールしてください。

ルートがないと、AndroidシステムがAndroid 8.0Oreoで永続的な「アプリはバックグラウンドで実行されています」」という通知を表示しないようにする方法はありません。 ForegroundServiceController、その実装、およびForegroundServiceDialogのソースコードは、実際に利用できるものを明らかにしていません。プログラム的には、これまで何も見つかりませんでした。

これがあなたを助けることができるブログ投稿です

2
Supradip.M

まず、NotificationListenerService実装が必要です。次に、このサービス(onListenerConnectedコールバック後)で、「Android」というpackageNameを使用してアクティブな進行中の通知を確認します。そして、この通知のtitleがアプリ名であるか、text値が 'アプリがバックグラウンドで実行されている'であることを確認し、スヌーズします。

public class NLService extends NotificationListenerService {

   @Override
   public void onNotificationRemoved(StatusBarNotification sbn) {}

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

      checkOngoingNotification();
   }

   @Override
   public void onNotificationPosted(StatusBarNotification sbn){

      if(sbn.isOngoing()) { 

         checkOngoingNotification(); 
         return; 
      }
   }

   private void checkOngoingNotification() {

      StatusBarNotification[] activeNotifications = getActiveNotifications();

      Log.i("NLService", "Active notifications size : " + activeNotifications.length);

      for (StatusBarNotification statusBarNotification : activeNotifications) {

         Log.i("NLService", "notification package  : " + statusBarNotification.getPackageName());
         Log.i("NLService", "notification id       : " + statusBarNotification.getId());
         Log.i("NLService", "notification key      : " + statusBarNotification.getKey());
         Log.i("NLService", "isOngoing             : " + statusBarNotification.isOngoing());
         Log.i("NLService", "isClearable           : " + statusBarNotification.isClearable());
         Log.i("NLService", "groupKey              : " + statusBarNotification.getGroupKey());

         Notification notification = statusBarNotification.getNotification();

         CharSequence title = notification.extras.getCharSequence(Notification.EXTRA_TITLE);
         CharSequence text  = notification.extras.getCharSequence(Notification.EXTRA_TEXT);


         if (title != null && text != null) {

            Log.i("NLService", "title                : " + title);
            Log.i("NLService", "text                 : " + text);


            if (statusBarNotification.getPackageName().equals("Android") &&
                (title.toString().contains("Your App Name") || text.toString().contains("App is running"))) {

                long snoozLong = 60000L * 60L * 24L * 20L;

                this.snoozeNotification(statusBarNotification.getKey(), snoozLong);

                Log.i("NLService", "Snoozed notification  : " + title);
            }
        }
    }
}
1
hsyn_tr