【问题标题】:Why Can't I Read String Resources from a Service in Android为什么我不能从 Android 中的服务中读取字符串资源
【发布时间】:2018-09-07 23:58:51
【问题描述】:

所以我很确定这是Context 的一个问题,我知道那里有很多相关的问题(我已经阅读过它们)但我找不到任何与我的具体情况相匹配的问题,所以希望有人能提供帮助。 我正在针对 API 28、min 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());
}

我从ServiceonStartCommand调用这个方法

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    UIHelper.notify(getApplicationContext(), "hello");
    return IntentService.START_STICKY;
}

【问题讨论】:

  • 能贴出代码吗?
  • 我已经添加了代码。
  • 通过 this 而不是 getApplicationContext()
  • 并使用context.getResources().getString() 而不仅仅是context.getString()
  • 行了。你能做一个正式的答案,所以我可以标记它是正确的。您能否就这些调用的区别提供一些说明?

标签: android android-service android-resources


【解决方案1】:

将您对getApplicationContext() 的呼叫替换为this

UIHelper.notify(this, "hello");

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

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

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

理论上,context.getString()context.getResources().getString() 完全相同(实际上只是一个代理方法),虽然它只是在 Marshmallow 中引入的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多