为什么我无法从Android中的服务读取字符串资源

时间:2018-09-07 00:21:59

标签: android android-service android-resources

因此,我非常确定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

1 个答案:

答案 0 :(得分:0)

getApplicationContext()代替对this的呼叫:

UIHelper.notify(this, "hello");

另外,使用context.getResources().getString()而不是context.getString()

不幸的是,我真的没有解释为什么会这样。

我的想法是您正在制作前台服务,因此该服务的通知应属于服务本身(扩展了上下文),而不属于应用程序。

从理论上讲,context.getString()context.getResources().getString()完全相同(实际上只是一个代理方法),尽管它只是在棉花糖中引入的。