Так что я почти уверен, что это проблема с Context
, и я знаю, что есть много связанных вопросов (я их читал), но ничего, что я не мог найти, соответствовало моему конкретному случаю, так что надеясь, что кто-то может помочь. Я работаю с API 28, минимум 24, языковой уровень 7 и работаю на планшете Samsung Android 7.
Situtation
В моем проекте у меня есть 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
onStartCommand
@Override
public int onStartCommand(Intent intent, int flags, int startId){
UIHelper.notify(getApplicationContext(), "hello");
return IntentService.START_STICKY;
}