我对各种术语(“横幅”,“弹出式”,“通知类型”)进行了相当广泛的研究,我似乎无法清楚地看到我认为的是一个非常常见的问题。所以如果有一个非常明显的解决方案,由于我缺乏术语,我会错过,请提供建议。
问题是这样的:我想要一个Android通知显示为从屏幕顶部掉下来的“横幅”(如果横幅是错误的话,请告知)。我浏览了文档并且似乎没有跨越这种行为的设置。这是我想要的一个例子:
我有通知工作,但它目前只出现在抽屉里面。它不会从抽屉里掉下来(这就是我想要的)。
这是我的代码,如果您可以建议我如何使它也显示为横幅我会非常感激:
public void createNotification(Context context, Bundle extras)
{
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String appName = getAppName(this);
Intent notificationIntent = new Intent(this, PushHandlerActivity.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
notificationIntent.putExtra("pushBundle", extras);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
int defaults = Notification.DEFAULT_ALL;
if (extras.getString("defaults") != null) {
try {
defaults = Integer.parseInt(extras.getString("defaults"));
} catch (NumberFormatException e) {}
}
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context)
.setDefaults(defaults)
.setSmallIcon(context.getApplicationInfo().icon)
.setWhen(System.currentTimeMillis())
.setContentTitle("NotificationTitle")
.setTicker(extras.getString("title"))
.setContentIntent(contentIntent)
.setAutoCancel(true);
String messageJson = extras.getString("data");
JSONObject parsed;
String message = null;
try {
parsed = new JSONObject(messageJson);
message = parsed.getString("message");
} catch (JSONException e) {
e.printStackTrace();
}
if (message != null) {
mBuilder.setContentText(message);
} else {
mBuilder.setContentText("Notification");
}
String msgcnt = extras.getString("msgcnt");
if (msgcnt != null) {
mBuilder.setNumber(Integer.parseInt(msgcnt));
}
int notId = 0;
try {
notId = Integer.parseInt(extras.getString("notId"));
}
catch(NumberFormatException e) {
Log.e(TAG, "Number format exception - Error parsing Notification ID: " + e.getMessage());
}
catch(Exception e) {
Log.e(TAG, "Number format exception - Error parsing Notification ID" + e.getMessage());
}
mNotificationManager.notify((String) appName, notId, mBuilder.build());
}
在后台的应用程序基本上不会调用onMessageReceived()
方法。
只有当通知没有notification
密钥时,应用程序才能在后台调用onMessageReceived()
方法。
所以,不要使用notification
密钥。
{
"to": "/topics/notice",
"notification": {
"title": "title",
"body": "body"
},
"data": {
"url": "https://your-url.dev"
}
}
只使用data
键。
{
"to": "/topics/notice",
"data": {
"title": "title",
"body": "body"
"url": "https://your-url.dev"
}
}
并将优先级设置为最大值。
notificationBuilder.setContentTitle(title)
// ...
.setPriority(NotificationCompat.PRIORITY_MAX)
// ...
;
然后,您将存档您想要的内容。
见:http://developer.android.com/design/patterns/notifications.html
你想要一个单挑通知。这要求您将Notifications Builder(.setPriority)的优先级设置为high或max。
你基本上需要了解WindowManager的工作原理。
你得到了
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
然后,如果要添加视图,则需要获取根视图并使用方法addView(view,params)。
看看这个cool article,这可能对你的用例有所帮助。
猎户座Granatir是对的。对于Xamarin.Android开发人员,这里是代码:
//Create the notification
var notification = new Notification(Resource.Drawable.icon, title);
//Auto-cancel will remove the notification once the user touches it
notification.Flags = NotificationFlags.AutoCancel;
notification.Sound = RingtoneManager.GetDefaultUri(RingtoneType.Notification);
notification.Defaults = NotificationDefaults.Vibrate | NotificationDefaults.Lights;
notification.BigContentView = new Android.Widget.RemoteViews(AppSettings.Instance.PackageName, Resource.Layout.notification_template_big_media);
notification.LargeIcon = BitmapFactory.DecodeResource(Resources, Resource.Drawable.icon);
notification.Priority = (int)Android.App.NotificationPriority.Max;//A notification that is at least Notification.PriorityHigh is more likely to be presented as a heads-up notification.