9

過去数日間、アプリのNotificationManagerに問題があり、解決に近づいていないようです。

私は今のところ何もしない非常にシンプルなサービスを持っています。通知を表示することになっています:

public class UpdateService extends Service {
private static final String TAG = "UpdateService";
private static int NOTIFICATION_ID = 1;
private UpdateServiceBinder binder = new UpdateServiceBinder();

@Override
public void onCreate() {
        Log.i(TAG, "Service created");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "Service started");
    
    sendNotification(100);
    
    return Service.START_NOT_STICKY;
}

private void sendNotification(int updatedItems) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext())
            .setSmallIcon(R.drawable.icon)
            .setContentTitle("Sync")
            .setContentText("Updated " + updatedItems);
    
    Intent resultIntent = new Intent(getBaseContext(), MainActivity.class);
    
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(resultIntent);

    PendingIntent resultPendindIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    
    builder.setContentIntent(resultPendindIntent);
    
    NotificationManager manager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(NOTIFICATION_ID, builder.build());
}
    
@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public boolean onUnbind(Intent intent) {
    return true;
}

public class UpdateServiceBinder extends Binder {
    public UpdateService getService() {
        return UpdateService.this;
    }
}

}

残念ながら、サービスが開始され、通知が表示されることになっている場合、何も起こりません。ログメッセージによると、サービスは確実に開始されます。同時に、NotificationManagerからの警告があります。

11-30 23:24:34.620:I / UpdateService(28356):サービスが作成されました

11-30 23:24:34.800:I / UpdateService(28356):サービスが開始されました

11-30 23:24:34.808:W / NotificationManager(28356):通知:IDが破損しています:1が送信され、0が返されました

1以外の番号を使用してみましたが、役に立ちませんでした。私はそれから何を作るのかわかりません。私が使用しているコードは、ここにあるサービスとここにある通知に関するAndroidのドキュメントからのものです。通知に取り組んでいるものと同じように設定された別のクリーンなアプリでコードを分離すると、正しく表示されます。誰かが以前にこの問題を抱えていたことがありますか、または何かアイデアがありますか?

助けていただければ幸いです。ありがとう!

4

7 に答える 7

13

この問題が発生したので、「アプリ情報」から「通知の表示」を無効にしたことを思い出します。有効にすると、通知が再び返されます。

  1. [設定]>[アプリ(アプリケーションマネージャー)]に移動します。
  2. 停止するアプリをタップします。
  3. タップして、[通知を表示する]チェックボックスをオフにします。

参考までに、Androidデバイスごとに異なる場合がありますが、それらはすべてほぼ同じです。

于 2013-02-09T22:02:54.593 に答える
5

API 25(Nougat)から開始し、Androidはレート制限を設定して、アプリが通知シェードをDDOSするのをブロックします。この変更を導入するAOSPへのコミットはここで見ることができます。

ループ内で進行状況通知を更新しようとしたため、これらのログが自分の側に表示されていました。

Observable.range(0, 100)
  .subscribe(progress -> updateProgressNotification(progress));

各放出の間に200msの遅延を追加すると、問題が解決します。

Observable.range(0, 100)
  .zipWith(Observable.interval(200, TimeUnit.MILLISECONDS), (progress, delay) -> progress)
  .subscribe(progress -> updateProgressNotification(progress));

この問題の詳細については、私のブログをご覧ください

于 2017-08-16T08:47:11.470 に答える
1

私はこの問題の解決策を見つけました。パッケージ名をcom.gttn.sampleからcom.gttn.sample2に変更する必要がありました。なぜそれをしなければならなかったのかよくわかりませんが、通知は正しく表示され、警告は消えました。

于 2012-12-02T20:07:55.033 に答える
1

アプリを何度もインストールして再インストールすると、何か

[設定]>[ApplicationManager]>[アプリ]の[通知を表示する]のチェックを外します。

もう一度「通知を表示」をチェックして、幸せになりましょう。

于 2015-08-25T13:37:48.943 に答える
0

曲をダウンロードし、ダウンロードの進行状況を通知の進行状況として更新するコードを作成しました。コードの6行目にある場合、その条件が削除されると、whileループが入力ストリームからバイトを読み取るため、通知が非常に高速に更新されます。これにより、通知が繰り返し更新され、これはnoughatから始まる問題として認識されます。通知の更新のレート制限を維持するバージョン。あなたがそれについていくつかのアイデアを得たことを願っています。

 int previousPercentage = 0;
 int currentPercentage = 0;
 while ((bytesRead = inputStream.read(bytes)) != -1) {
       totalbytes = totalbytes + bytesRead;
       currentPercentage = (totalbytes * 100) / length_of_file;
       if (previousPercentage != currentPercentage) {// line : 6
        updateProgressNotification(builder, notificationId, currentPercentage);
       }
       previousPercentage = currentPercentage;
       fileOutputStream.write(bytes, 0, bytesRead);
 }
于 2018-08-14T13:09:50.947 に答える
-1

getBaseContext()を使用している理由はわかりませんが、代わりにgetApplicationContext()を使用することをお勧めします。また、なぜあなたが本サービスに拘束されているのかわかりません。

于 2012-12-01T01:19:40.847 に答える
-1

この問題を自分で調べただけです。ログファイルに追加の行がない場合(5行以内にある必要があります)、「E / NotificationService(287):ユーザー要求によるパッケージからの通知の抑制」のようなメッセージが表示される場合があります。これは、アプリごとに通知を無効にするICS(おそらくJB)の新しい設定です。[設定]->[アプリ]->に移動し、上部にある[通知を表示する]チェックボックスをクリックします。明らかな理由で、パッケージ名を変更すると、この設定を非常に効果的に回避できます。

于 2013-01-08T22:45:28.843 に答える