- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的应用程序中加入了对奥利奥的支持。现在编译和目标 SDK 版本是 27。我已经创建了一个 channel 来获取我的通知。我正在从应用程序类调用创建 channel 方法。当应用程序处于前台时,通知看起来不错。但是当我在应用程序处于后台时收到通知的那一刻,默认 channel 正在创建,以便在通知托盘中显示 1 个默认通知和 1 个自定义通知。我正在使用广播接收器来获取通知。下面给出的是我的代码。
list .xml
<receiver
android:name=".receiver.PushMessageReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter android:priority="999">
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.caps" />
</intent-filter>
</receiver>
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="com.caps" />
广播接收器.java
public class PushMessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
abortBroadcast();
Logger.d(Logger.TAG, "notification received");
if (intent != null) {
NotificationHandler.handleNotification(context, formNotificationObject(intent));
}
}
private Notification formNotificationObject(Intent intent) {
Notification notification = new Notification();
notification.setMessageId(TextUtils.isEmpty(intent.getStringExtra("messageid")) ?
0 : Integer.parseInt(intent.getStringExtra("messageid")));
notification.setTitle(intent.getStringExtra("title"));
notification.setBody(intent.getStringExtra("body"));
notification.setImage(intent.getStringExtra("image"));
notification.setType(intent.getStringExtra("type"));
notification.setUrl(intent.getStringExtra("url"));
notification.setExpiry(intent.getStringExtra("expiry"));
if (intent.hasExtra("param")) {
String data = intent.getStringExtra("param");
ObjectMapper mapper = new ObjectMapper();
try {
CFLProduct product = mapper.readValue(data, CFLProduct.class);
notification.setParam(product);
} catch (IOException e) {
e.printStackTrace();
}
}
return notification;
}
}
NotificationHandler.java
public class NotificationHandler {
private static final CharSequence ANDROID_CHANNEL_NAME = "Promotions";
private static final String ANDROID_CHANNEL_ID = "com.caps";
private static NotificationManager mNotificationManager;
public static void handleNotification(Context context, Notification notification) {
if (notification != null) {
Logger.d(Logger.TAG, notification.toString());
showNotification(context, notification);
} else {
Logger.e(Logger.TAG, "notification is null");
}
}
private static NotificationCompat.Builder getNotificationBuilder(Context context) {
if (CommonUtils.isOreoOrAbove()) {
return new NotificationCompat.Builder(context, ANDROID_CHANNEL_ID);
} else {
return new NotificationCompat.Builder(context);
}
}
private static void showNotification(final Context context, final Notification notification) {
final NotificationCompat.Builder builder = getNotificationBuilder(context);
builder.setContentTitle(notification.getTitle());
builder.setContentText(notification.getBody());
NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle();
bigTextStyle.setBigContentTitle(notification.getTitle());
bigTextStyle.bigText(notification.getBody());
builder.setStyle(bigTextStyle);
// Playing notification sound
builder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
getNotificationIcon(context, builder);
builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(),
R.mipmap.ic_launcher));
builder.setAutoCancel(true);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
Intent resultIntent = new Intent(context, HomeActivity.class);
resultIntent.putExtra(AppConstants.BundleKeys.NOTIFICATION, notification);
stackBuilder.addParentStack(HomeActivity.class);
final int id = new Random().nextInt(1000);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(id, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(resultPendingIntent);
if (CommonUtils.isValidUrl(notification.getImage())) {
/* DownLoadBitMap downLoadBitMap = new DownLoadBitMap(context, builder, id, notification);
downLoadBitMap.execute(notification.getImage());*/
DownLoadBitmap downLoadBitmap = new DownLoadBitmap(context, builder, id, notification);
downLoadBitmap.loadFromGlide();
} else {
showSmallNotification(context, builder, id);
}
}
private static void getNotificationIcon(Context context, NotificationCompat.Builder notificationBuilder) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notificationBuilder.setSmallIcon(R.drawable.ic_notification_small_icon);
notificationBuilder.setColor(ContextCompat.getColor(context, R.color.colorPrimary));
} else {
notificationBuilder.setSmallIcon(R.mipmap.ic_launcher);
}
}
private static void showSmallNotification(Context context, NotificationCompat.Builder builder, int id) {
if (AppData.getInstance().getNotificationCount() == 0) {
AppData.getInstance().setNotificationCount(1);
}
getManager(context).notify(id, builder.build());
}
private static void showBigNotification(Context context, NotificationCompat.Builder builder, Bitmap bitmap, int id, Notification notification) {
if (AppData.getInstance().getNotificationCount() == 0) {
AppData.getInstance().setNotificationCount(1);
}
NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
bigPictureStyle.bigPicture(bitmap);
bigPictureStyle.setBigContentTitle(notification.getTitle());
bigPictureStyle.setSummaryText(notification.getBody());
builder.setStyle(bigPictureStyle);
getManager(context).notify(id, builder.build());
}
@RequiresApi(api = Build.VERSION_CODES.O)
public static void createChannels(Context context) {
// create android channel
NotificationChannel androidChannel = new NotificationChannel(ANDROID_CHANNEL_ID,
ANDROID_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
// Sets whether notifications posted to this channel should display notification lights
androidChannel.enableLights(true);
// Sets whether notification posted to this channel should vibrate.
androidChannel.enableVibration(true);
// Sets the notification light color for notifications posted to this channel
androidChannel.setLightColor(android.app.Notification.DEFAULT_LIGHTS);
// Sets whether notifications posted to this channel appear on the lockscreen or not
androidChannel.setLockscreenVisibility(android.app.Notification.VISIBILITY_PRIVATE);
getManager(context).createNotificationChannel(androidChannel);
}
private static NotificationManager getManager(Context context) {
if (mNotificationManager == null) {
mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
}
return mNotificationManager;
}
/**
* Downloading push notification image before displaying it in
* the notification tray
*/
private static class DownLoadBitmap {
private Context mContext;
private NotificationCompat.Builder mBuilder;
private int mId;
private Notification mNotification;
private SimpleTarget target = new SimpleTarget<Bitmap>(1024, 512) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
Logger.d(Logger.TAG, "I got the bitmap");
showBigNotification(mContext, mBuilder, resource, mId, mNotification);
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
super.onLoadFailed(e, errorDrawable);
Logger.d(Logger.TAG, "FAILED TO DOWNLOAD RESOURCE"+e.getMessage());
}
};
private DownLoadBitmap(final Context context, final NotificationCompat.Builder builder, final int id, final Notification notification) {
mContext = context;
mBuilder = builder;
mId = id;
mNotification = notification;
}
public void loadFromGlide() {
Glide.with(mContext)
.load(mNotification.getImage())
.asBitmap()
.into(target);
}
}
}
我不明白为什么在我已经创建 channel 并将其设置为默认 channel 时创建默认 channel 。这也只有当应用程序在后台时才会发生。可能是什么问题?我该如何解决?
最佳答案
您同时使用通知和数据,但在 showNotification
中您这样做:
bigTextStyle.setBigContentTitle(notification.getTitle());
bigTextStyle.bigText(notification.getBody())
在上面,您收到通知有效载荷并将其添加到 BigContentTitle
和 BigText
中,而数据有效载荷未被添加,因此在后台时(自通知payload 仅在前台触发),您会收到默认通知。
您需要接收数据负载,因为如果应用程序在后台和前台运行,它就会被触发。
所以你可以这样做:
bigTextStyle.setBigContentTitle(notification.getData().get("title")); //title name in the data payload
bigTextStyle.bigText(notification.getData().get("body")); //body name in the data payload
还有其他像 setSummaryText(..)
, setContentTitle(..)
, and setContentText(..)
需要改变相应地。
关于java - 奥利奥通知翻倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48521320/
我创建了一项服务,可以在设备移动时跟踪其位置。该服务由与其绑定(bind)的 Activity 启动,在该 Activity 中有一个“Start Tracking”按钮。按下此按钮时,我需要服务在前
在 oreo 中如何启用通知 LED 闪烁而没有通知声音,如果我禁用通知声音 LED 不闪烁 Notification notification = new NotificationCompat.
我将 NotificationCompat.Builder 设置为: .setSound(getNotificationSound(), AudioManager.STREAM_ALARM) .set
我正在 Oreo AOSP 中开发一个简单的系统应用程序,以使用预定义的 SSID 和预共享 key 打开 wifi 热点。 因为我的应用程序是作为系统应用程序构建的,所以我不需要反射。 主 Acti
我正在开发一个物联网应用程序,其中有一个登录流程,用户连接到一个没有互联网连接的接入点,配置设备,然后连接到他的家庭 Wifi 网络。 Android 8 设备导致了一些问题,与接入点断开连接并重新连
根据 "developer.android.com" If the app targets Android 8.0 (API level 26), the system grants only REA
针对 Android O 的应用程序在使用服务时有一些新规则,其中之一是我们不能在应用程序处于后台时启动服务。 成为默认 SMS 应用程序的要求之一是:(来自 Telephony.java javad
作为测试,我从我们拥有的工作服务中删除了“startForeground(通知)”,它似乎仍在工作。 我们是否不需要在 Android O 及更高版本上发布工作服务的前台通知? 我无法找到这方面的具体
每当用户调用新电话时,我都试图在我的应用程序上触发通知。我在我的 Activity 中注册接收器并在 onDestroy() 方法中销毁它。以下是注册的代码 fragment registerRece
当应用程序位于前台时,我正在尝试使用 firebase 显示通知。当我从服务器推送通知时调用了 onMessageReceived 方法,但是通知没有显示。 这里是我的代码: public class
我正在尝试从相机 Intent 获取图像。它运行良好,但仅限于我的设备(oreo/8.1.0)。我生成未签名的 apk 并尝试在其他设备(pie 和 lolipop)中运行,但它不起作用。 我搜索了
我需要为我的应用程序中的所有屏幕禁用 Activity 过渡动画。以前的解决方案适用于所有 Android 版本: @null ...但对于 Android 8“Oreo”,每次转换(向前
我有一个相对简单的设置,应该在一天中的特定时间触发警报并向用户显示通知。这是相关代码, 设置闹钟 long inTime = /*expirationTime*/ Calendar.getInsta
https://android-developers.googleblog.com/2017/07/seccomp-filter-in-android-o.html 正如本文的“seccomp 过滤器
我在 google play 商店收到这条消息 - 这是这个应用程序的 list - Gradle 配置- defaultConfig { minSdkVersion 16
我有一个监视 wifi 连接的小部件,因此我启动了一个服务来启动广播接收器来检测网络变化。一切正常,除非我退出主应用程序:服务停止。 因此,我在小部件中启动了一个警报管理器,该管理器大约每分钟唤醒一次
我的代码: mNotifyBuilder.setSmallIcon(R.drawable.ic_status_bar) .setContentTitle("")
我的应用在 Google Play 上似乎存在某些 Android 8.0 设备的特定错误。 不幸的是,到目前为止我还无法自己复制该错误。 这是错误日志: android.content.res.Re
根据background execution limits在 Android Oreo 中引入,调用 startService当应用程序在后台时应该抛出一个 IllegalArgumentExcept
我目前正在使用 android api 级别 26(Nexus 6P)中可用的电话管理器(USSD 响应)。对于单步 ussd session ,它正在运行。 引用: http://codedrago
我是一名优秀的程序员,十分优秀!