- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我们的应用 OneBusAway Android (open-source on Github) 中,我们需要在用户关闭特定提醒通知时收到通知,因此我们不会为同一事件发布另一个提醒通知(他们的巴士到达还有多长时间)。
我们通过监听 Intent
来做到这一点。在我们的应用程序中,注册为 DeleteIntent
与 Notification
.当用户关闭通知时(通过滑动它,或点击通知窗口中的清除按钮),我们的应用程序应该收到 Intent
.
从测试来看,似乎与 the current version on Google Play (和 current master branch on Github ),在以下 Android 版本中,我们的应用程序永远不会收到 DeleteIntent:
private Notification createNotification(Uri alertUri) {
//Log.d(TAG, "Creating notification for alert: " + alertUri);
Intent deleteIntent = new Intent(mContext, AlarmReceiver.class);
deleteIntent.setAction(TripService.ACTION_CANCEL);
deleteIntent.setData(alertUri);
return new NotificationCompat.Builder(mContext)
.setSmallIcon(R.drawable.ic_stat_notification)
.setDefaults(Notification.DEFAULT_ALL)
.setOnlyAlertOnce(true)
.setDeleteIntent(PendingIntent.getBroadcast(mContext, 0,
deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT))
.setAutoCancel(true)
.build();
}
@SuppressWarnings("deprecation")
private void setLatestInfo(Notification notification,
String stopId,
String routeId,
long timeDiff) {
final String title = mContext.getString(R.string.app_name);
final PendingIntent intent = PendingIntent.getActivity(mContext, 0,
new ArrivalsListActivity.Builder(mContext, stopId).getIntent(),
PendingIntent.FLAG_UPDATE_CURRENT);
notification.setLatestEventInfo(mContext,
title,
getNotifyText(routeId, timeDiff),
intent);
}
TripService
包含 Action 的常量:
public static final String ACTION_CANCEL =
"com.joulespersecond.seattlebusbot.action.CANCEL";
public class AlarmReceiver extends BroadcastReceiver {
private static final String TAG = "AlarmReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "In onReceive with intent action " + intent.getAction());
...
}
}
<receiver android:name=".AlarmReceiver">
<!-- These action names must match the constants in TripService -->
<intent-filter>
<action android:name="com.joulespersecond.seattlebusbot.action.SCHEDULE" />
<action android:name="com.joulespersecond.seattlebusbot.action.POLL" />
<action android:name="com.joulespersecond.seattlebusbot.action.CANCEL" />
</intent-filter>
</receiver>
Intent deleteIntent = new Intent(mContext, AlarmReceiver.class);
deleteIntent.setAction(TripService.ACTION_CANCEL);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
deleteIntent.setDataAndTypeAndNormalize(alertUri, TripService.REMINDER_MIME_TYPE);
} else {
deleteIntent.setDataAndType(alertUri, TripService.REMINDER_MIME_TYPE);
}
return new NotificationCompat.Builder(mContext)
.setSmallIcon(R.drawable.ic_stat_notification)
.setDefaults(Notification.DEFAULT_ALL)
.setOnlyAlertOnce(true)
.setDeleteIntent(PendingIntent.getBroadcast(mContext, 0,
deleteIntent, 0))
//.setLights(0xFF00FF00, 1000, 1000)
//.setVibrate(VIBRATE_PATTERN)
.build();
REMINDER_MIME_TYPE
是
application/vnd.com.joulespersecond.seattlebusbot.reminder
<receiver android:name=".AlarmReceiver">
<!-- These action names must match the constants in TripService -->
<intent-filter>
<action android:name="com.joulespersecond.seattlebusbot.action.SCHEDULE" />
<action android:name="com.joulespersecond.seattlebusbot.action.POLL" />
<action android:name="com.joulespersecond.seattlebusbot.action.CANCEL" />
<data android:mimeType="application/vnd.com.joulespersecond.seattlebusbot.reminder" />
</intent-filter>
</receiver>
Notification.Builder
而不是
NotificationCompat.Builder
),但这也没有改变任何东西。
Notification.setLatestEventInfo()
中的 Android 错误造成的。 - 我在这里报告过:
Notification.setLatestEventInfo()
。 - 改为使用
Notification.Builder
创建一个新的通知。
最佳答案
在您的示例项目中,如果删除以下行,deleteIntent
适用于运行 4.4.4 的 Nexus 4:
setLatestInfo(getActivity(), notification, routeId);
deleteIntent
.重新申请您的
deleteIntent
可能会起作用到
Notification
作为您的
setLatestInfo()
的一部分加工。
关于java - 通知 DeleteIntent 在更高版本的 Android 上被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24769228/
我目前在我的 Android 应用程序中有一个通知,它有一个 PendingIntent,所以当它被点击时,一个 Activity 就会打开。 我目前为通知保留一个计数器,类似于 native 未接来
我在我的应用程序中实现 GCM 并保留通知的哈希值以跟踪通知栏中的内容(我必须根据用户是在应用程序中还是不在应用程序中来更改 Intent )。 我为所有通知设置了 deleteIntent Pend
我已经阅读了几个关于类似问题的问题,但它们没有为我提供解决方案。 在我的 Android 应用程序中,我触发了一个通知(具体来说是在 Application 类中,它实际上是从 C2DM 推送事件开始
我正在尝试检测我的通知何时被清除。我的问题直接引用这个answer这概述了我应该做的事情。这就是我执行这些操作的方式: // usual Notification initialization her
Notification.deleteIntent 可以很好地清除通知,但许多生成通知的应用将此保留为空。 NotificiationListenerService.cancelNotificatio
在我们的应用 OneBusAway Android (open-source on Github) 中,我们需要在用户关闭特定提醒通知时收到通知,因此我们不会为同一事件发布另一个提醒通知(他们的巴士到
我是一名优秀的程序员,十分优秀!