Почему я не могу прочитать строковые ресурсы из службы в Android - PullRequest
0 голосов
/ 07 сентября 2018

Так что я почти уверен, что это проблема с 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;
}

1 Ответ

0 голосов
/ 07 сентября 2018

Замените ваш звонок на getApplicationContext() на this:

UIHelper.notify(this, "hello");

Также используйте context.getResources().getString() вместо context.getString().

К сожалению, у меня нет объяснения, почему это так.

Я думаю, что вы создаете приоритетную службу, поэтому уведомление для этой службы должно принадлежать самой службе (которая расширяет контекст), а не приложению.

Теоретически, context.getString() в точности совпадает с context.getResources().getString() (на самом деле это просто прокси-метод), хотя он был введен только в «Зефир».

...