如何检查Android Dev中状态栏中哪些通知处于活动状态?

时间:2010-09-02 19:58:19

标签: android

我制作了一款可在Android手机下拉状态栏中设置通知的应用。但是,我的代码中存在一个错误(有时会设置通知,有时则不会)。我希望能够检查(在代码中)如果通知对用户是可见的。 (即用户可以在状态栏中看到通知吗?)。

我该怎么做? (提前致谢)。

非常感谢示例代码。

8 个答案:

答案 0 :(得分:40)

  

我希望能够检查(在代码中)如果通知对用户是可见的。 (即用户可以看到   状态栏中的通知?)。

     

我该怎么做?

你不能,抱歉。更新:现在可以使用Android 4.3 + http://developer.android.com/reference/android/service/notification/NotificationListenerService.html#getActiveNotifications()

但是,您可以随时cancel() - 取消不在屏幕上的Notification完全没问题。相反,您可以随时为同一notify()安全地再次致电Notification,如果Notification已在屏幕上,也不会导致问题。

修改

如果您不想使用NotificationListenerService

,则在API 23中添加了

NotificationManager.getActiveNotifications()

答案 1 :(得分:29)

只是把所有人放在一起。这是它的工作原理

要建立通知,

        Notification n = new Notification.Builder(MyService.this)
                .setContentTitle("Notification Title")
                .setContentText("Notification Message")
                .setSmallIcon(R.drawable.myicon).build();

要发出通知声音,请致电setSound()通知

        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Notification n = new Notification.Builder(MyService.this)
                .setContentTitle("Notification Title")
                .setContentText("Notification Message")
                .setSound(alarmSound)
                .setSmallIcon(R.drawable.myicon).build();

要在用户选择并启动接收方意图后取消通知,请致电setAutoCancel()

        Notification n = new Notification.Builder(MyService.this)
                .setContentTitle("Notification Title")
                .setContentText("Notification Message")
                .setSound(alarmSound)
                .setAutoCancel(true)
                .setSmallIcon(R.drawable.myicon).build();

要使特定通知仅使声音/振动一次,请使用Notification.FLAG_ONLY_ALERT_ONCE。使用此标志,您的通知只会发出一次声音,直到它被取消,您可以使用通知ID多次调用notify()。请注意,如果您调用cancel()或用户取消通知或自动取消,则notify()调用将再次发出通知。

        n.flags |= Notification.FLAG_ONLY_ALERT_ONCE;    // Dont vibrate or make notification sound

最后将通知放在通知面板上,

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notificationManager.notify(notification_id, n);

请注意,notification_id此处非常重要,如果您想有效使用通知。(为通知保留单一声音/振动或取消特定通知)。

要取消特定通知,

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.cancel(notification_id);

您可以cancel()发送通知即使它不存在,也可以根据需要使用相同的ID呼叫notify()。请注意,使用不同ID调用notify将创建新通知。

因此,无论通知是否存在,如果您使用设置了notify()标记的正确notification_id再次致电Notification.FLAG_ONLY_ALERT_ONCE,您可以保持通知的有效性而不会打扰重复声音的用户。

答案 2 :(得分:27)

您需要为每个通知设置一个ID。

所以你发了通知..

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, notId + selectedPosition, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis() - offset, pendingIntent);

Notification notification = new Notification(R.drawable.icon, "TVGuide Υπενθύμιση", System.currentTimeMillis());
NotificationManager manger = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
notification.setLatestEventInfo(context, "Κανάλι: " + b.getString("channel"), "Εκπομπή: " + showname, pendingIntent);
manger.notify(notId, notification);

清除它..

PendingIntent pendingIntent = PendingIntent.getBroadcast(context,notId, intent, 0); 
pendingIntent.cancel();

并检查是否有活动..(如果没有可用的待处理意图,则existsAlarm返回null)

 public PendingIntent existAlarm(int id) {
  Intent intent = new Intent(this, alarmreceiver.class);
  intent.setAction(Intent.ACTION_VIEW);
  PendingIntent test = PendingIntent.getBroadcast(this, id + selectedPosition, intent, PendingIntent.FLAG_NO_CREATE);
  return test;
 }

因此,所有内容都归结为初始化每个通知的ID以及如何使其唯一。

答案 3 :(得分:6)

API 23中的NotificationManager类引入了一种新方法:

// Multidimensional array
$superheroes = array(
    "spider-man" => array(
        "name" => "Peter Parker",
        "email" => "peterparker@mail.com",
        ),
    "super-man" => array(
        "name" => "Clark Kent",
        "email" => "clarkkent@mail.com",
        ),
    "iron-man" => array(
        "name" => "Harry Potter",
        "email" => "harrypotter@mail.com",
        )
    );

// Printing all the keys and values one by one
    $keys = array_keys($superheroes);
    for($i = 0; $i < count($superheroes); $i++) {
        echo $keys[$i] . "{<br>";
        foreach($superheroes[$keys[$i]] as $key => $value) {
            // echo $key . " : " . $value . "------";
            echo '<wp:meta_key>'.$value['email'].'<wp:meta_key>';
            echo '<wp:meta_value><![CDATA['.$value['name'].']]></wp:meta_value>';
        }
        echo "}<br>";
    }

答案 4 :(得分:4)

有一面旗帜。

Notification notification = new Notification(icon, tickerText, when);
notification.flags |= Notification.FLAG_ONLY_ALERT_ONCE;

FLAG_ONLY_ALERT_ONCE:

  如果您希望每次发送通知时都要播放声音和/或振动,则应设置

....即使在此之前尚未取消通知。

虽然通知 会在再次发送时闪烁,但不会有任何声音或振动。

答案 5 :(得分:3)

答案 6 :(得分:1)

来自Android M(API 23)的seems可以在不使用NotificationListenerService的情况下获取您的流程,也不需要其他权限:

notificationManager.getActiveNotifications()

答案 7 :(得分:0)

从Android Marshmallow(API 23)开始,您可以恢复应用发布的有效通知列表。此 NotificationManager 方法为getActiveNotifications()。更多信息:https://developer.android.com/reference/android/app/NotificationManager.html#getActiveNotifications()