android - SDK 中的 Android 服务问题 >= 26
问题描述
我正在创建一个应用程序,即使应用程序从进程中或在后台被终止,它也会向用户发送通知。实际上,在 SDK >= 26 的 Android 版本中,我使用的是前台服务。为了显示通知,我有一个服务 (DatasNotification),它启动一个 asyncTask (HttpRequest) 以发出 http 请求,并且在条件结束时的 asynctask 启动一个显示通知的新服务。当我的应用程序进入后台时,我有一个系统通知说:我的应用程序正在耗尽电池。在我的分析过程中,我了解到这个系统通知是由 DatasNotification 服务生成的。
这是我的 DatasNotification 代码:
@Override
public void onCreate() {
super.onCreate();
Fabric.with(this, new Crashlytics());
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForeground(1, new Notification());
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new HttpRequest(getApplicationContext(), 0).execute();
return START_STICKY;
}
在 sdk >= 26 中运行后台服务有什么解决方案吗?
解决方案
这是 Oreo (API26-27) 的特定功能,用于在应用程序运行后台服务时显示“[应用程序] 正在使用电池”的系统通知。您会注意到您不会在设备中收到相同的警告运行 P (API28) 或 Android 10 (API 29),因为该警告已被完全删除/禁用。我认为您无法在应用程序中更改任何内容以防止该警告显示在 Oreo 设备中,除非您可以摆脱您的(后台)服务。
用户可以通过执行以下操作来禁用该警告:
- 解锁运行 Android Oreo 的设备
- 在通知栏上向下滑动,将“使用电池”通知完全暴露出来
- 长按通知直到它改变并显示一个切换
- 点击切换开关,确保它显示为灰色
- 选择完成以禁用“使用电池”通知
(来源)
推荐阅读
- android - laravel API,我如何发送令牌?
- javascript - 在 JavaScript ES6 中,如果 console.log() 不调用 obj.toString(),它有什么用?
- python - 使用从模型填充的数据的 Django 加载表单
- ios - 自定义 UILabel、UIButton 类的 viewWillAppear 替代方案
- php - Wordpress 排队插件脚本未在前端加载
- c - 谁能告诉我为什么这段代码不起作用并保持打印 0.00 公里作为最短距离?
- java - MVVM - 在模型类中获取上下文
- python - 每次出现时如何保留numpy数组的最新元素
- javascript - 与 bcrypt.compare 一起使用时,resp.cookie 不起作用
- regex - 如何仅在双引号Notepad ++之间的字符串和数字组合中替换字符串?