因此,我非常确定Context
会出现这个问题,而且我知道这里有很多相关问题(我已经阅读过这些问题),但找不到任何与我的具体情况相符的问题,希望有人可以救命。 我正在使用API 28(最低24),语言7级进行构建,并在Android 7 Samsung平板电脑上运行。
在我的项目中,我有一个Service
,它打算在设备启动时启动,并且确实如此。为了自己进行验证,我让服务部发出了通知。一旦开始工作,我便清理代码并将所有标题,名称等移至strings.xml
文件中的字符串资源中。
该通知不再出现。如果我使用硬编码的字符串,那么一切都很好,如果我尝试使用字符串资源,则通知将失败。我的猜测是,这与Context
(从中请求字符串)有关,并且无法访问它们。但是,在硬编码字符串的情况下,成功查询了图标资源(可绘制)和颜色资源,因此我不清楚字符串的区别是什么。我可以对字符串进行硬编码并命名为“一天”,但我认为这与Android最佳做法背道而驰。我还应该注意,如果我实际启动该应用程序,那么一切都很好,只要在“启动”条件下,这就是一个问题。
有人知道我在做什么错吗?
这有效:
public static void notify(Context context, String text){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
"CHANNEL",
"My App",
NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("Service status update channel");
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder n = new NotificationCompat.Builder(context, "CHANNEL")
.setContentTitle("Status")
.setContentText(text)
.setSmallIcon(R.drawable.ic_notification)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setColor(ContextCompat.getColor(context, R.color.colorPrimary))
.setOngoing(true)
.setAutoCancel(false)
.setOnlyAlertOnce(true);
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.notify(notification_id, n.build());
}
这不是:
public static void notify(Context context, String text){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
context.getString(R.string.notification_channel),
context.getString(R.string.notification_channel_name),
NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription(context.getString(R.string.notification_channel_desc));
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder n = new NotificationCompat.Builder(context, context.getString(R.string.notification_channel))
.setContentTitle(context.getString(R.string.notification_title))
.setContentText(text)
.setSmallIcon(R.drawable.ic_notification)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setColor(ContextCompat.getColor(context, R.color.colorPrimary))
.setOngoing(true)
.setAutoCancel(false)
.setOnlyAlertOnce(true);
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.notify(notification_id, n.build());
}
我从Service
的{{1}}调用此方法
onStartCommand
答案 0 :(得分:0)
用getApplicationContext()
代替对this
的呼叫:
UIHelper.notify(this, "hello");
另外,使用context.getResources().getString()
而不是context.getString()
。
不幸的是,我真的没有解释为什么会这样。
我的想法是您正在制作前台服务,因此该服务的通知应属于服务本身(扩展了上下文),而不属于应用程序。
从理论上讲,context.getString()
与context.getResources().getString()
完全相同(实际上只是一个代理方法),尽管它只是在棉花糖中引入的。