我制作了一款可在Android手机下拉状态栏中设置通知的应用。但是,我的代码中存在一个错误(有时会设置通知,有时则不会)。我希望能够检查(在代码中)如果通知对用户是可见的。 (即用户可以在状态栏中看到通知吗?)。
我该怎么做? (提前致谢)。
非常感谢示例代码。
答案 0 :(得分:40)
我希望能够检查(在代码中)如果通知对用户是可见的。 (即用户可以看到 状态栏中的通知?)。
我该怎么做?
你不能,抱歉。更新:现在可以使用Android 4.3 + http://developer.android.com/reference/android/service/notification/NotificationListenerService.html#getActiveNotifications()
但是,您可以随时cancel()
- 取消不在屏幕上的Notification
完全没问题。相反,您可以随时为同一notify()
安全地再次致电Notification
,如果Notification
已在屏幕上,也不会导致问题。
修改强>
如果您不想使用NotificationListenerService
,则在API 23中添加了答案 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)
现在可以检查android 4.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()