- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题可能看起来很宽泛,但我会尽力总结一下。
因此,我正在 Play 商店 Multi Timer Free 上复制示例应用程序
应用程序用于设置多个计时器。
我几乎已经完成了该应用程序。但我面临着电池优化和警报管理器的一些问题,特别是华为和荣耀(中国Andorid操作系统)。我的前台服务在一段时间后停止工作。
问题:即使没有电池优化白名单,上面提到的示例应用程序也能非常出色地工作。解决这个问题的办法是什么?
我几乎尝试了下面链接中提到的所有内容。但没有运气
Doze mode - do foreground services continue to run?
How to handle background services in ANDROID O?
How to turn off battery optimization on Huawei devices
How to turn off battery optimization on the Huawei devices
How to turn off battery optimization on Huawei devices
Huawei device killing my foreground service, even with dontkillmyapp.com's solution
Optimize for Doze and App Standby
Android M startActivity battery optimization
Battery optimizations (wakelocks) on Huawei EMUI 4.0+
service killed when app cloes just in huawei device
Oreo (8.1) cannot start activity on lock screen
Creating a never ending background service in Android > 7
How does doze mode affect background/foreground services, with/without partial/full wakelocks?
What to do if alarms or sleep tracking don’t work?
Sample Code, When pressed device lock/unlock button, I want a simple TOAST to be shown when SCREEN_ON broadcast is received. This works fine for some time.
But in Huawei device => After killing the app by swipe -> after a 1 - 2 minutes my toast will stop working.
package com.demo.forgroundservicedemo
import android.content.Intent
import android.os.IBinder
import androidx.core.app.NotificationCompat
import android.os.Build
import android.app.*
import android.app.NotificationManager
import android.app.NotificationChannel
import android.content.BroadcastReceiver
import android.content.Context
import android.content.IntentFilter
import android.graphics.Color
import android.util.Log
import androidx.annotation.RequiresApi
import android.os.SystemClock
import android.app.AlarmManager
import android.app.PendingIntent
import android.widget.Toast
class ForegroundService : Service() {
override fun onCreate() {
Log.e("ForegroundService", "onCreate called")
super.onCreate()
}
@RequiresApi(Build.VERSION_CODES.O)
private fun startMyOwnForeground() {
val NOTIFICATION_CHANNEL_ID = CONST.CHANNELID
val channelName = CONST.channelName
val chan = NotificationChannel(
NOTIFICATION_CHANNEL_ID,
channelName,
NotificationManager.IMPORTANCE_NONE
)
chan.lightColor = Color.BLUE
chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.createNotificationChannel(chan)
val notificationIntent = Intent(this, MainActivity::class.java)
notificationIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
val intent = PendingIntent.getActivity(
this, 0,
notificationIntent, 0
)
val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
notificationBuilder.setContentIntent(intent)
val notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(CONST.serviceTitle)
.setPriority(NotificationManager.IMPORTANCE_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.setAutoCancel(false)
.build()
notification.flags = notification.flags or Notification.FLAG_AUTO_CANCEL
startForeground(2, notification)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.e("ForegroundService", "onStartCommand called")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Log.e("SDK_INT", ">= Build.VERSION_CODES.O")
startMyOwnForeground()
} else {
startForeground(1, Notification())
}
registerBroadcastReceiver()
return START_STICKY
}
override fun onDestroy() {
Log.e("ForegroundService", "onDestroy called")
super.onDestroy()
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
private var mPowerKeyReceiver: BroadcastReceiver? = null
private fun registerBroadcastReceiver() {
Log.e("registerBroadcast", "called")
val theFilter = IntentFilter()
/** System Defined Broadcast */
theFilter.addAction(Intent.ACTION_SCREEN_ON)
//theFilter.addAction(Intent.ACTION_SCREEN_OFF)
mPowerKeyReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.e("onReceive", "onReceive called")
val strAction = intent!!.action
if (strAction == Intent.ACTION_SCREEN_ON) {
Toast.makeText(context, "SCREEN ON", Toast.LENGTH_LONG).show()
}
}
}
applicationContext.registerReceiver(mPowerKeyReceiver, theFilter)
}
private fun unregisterReceiver() {
val apiLevel = Build.VERSION.SDK_INT
if (apiLevel >= 7) {
try {
applicationContext.unregisterReceiver(mPowerKeyReceiver)
} catch (e: IllegalArgumentException) {
mPowerKeyReceiver = null
}
} else {
applicationContext.unregisterReceiver(mPowerKeyReceiver)
mPowerKeyReceiver = null
}
}
override fun onTaskRemoved(rootIntent: Intent?) {
super.onTaskRemoved(rootIntent)
Log.e("onTaskRemoved", "onTaskRemoved called")
unregisterReceiver()
val restartService = Intent(
applicationContext,
this.javaClass
)
restartService.setPackage(packageName)
val restartServicePI = PendingIntent.getService(
applicationContext, 1, restartService,
PendingIntent.FLAG_ONE_SHOT
)
val alarmService =
applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmService.setExactAndAllowWhileIdle(
AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 500,
restartServicePI
)
}
}
最佳答案
也许问题是您在安排闹钟时没有setRepeating
?
我基本上做同样的事情(当屏幕打开时更新小部件),我这样做:
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + 1000, interval, pendingIntent)
关于android - 华为、荣耀手机电池优化、前台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59857099/
我开发游戏已经有一段时间了,我开始意识到我的应用程序很快就会耗尽设备电池。我通过 XCode 仪器测量了能量消耗,一般在 17/20 范围内。我有一些背景动画,禁用它们似乎确实有帮助。出于好奇,我使用
我有两个原型(prototype)电池。如果 messagesArray[indexPath.row] 值为“”,则出现一个,如果该值包含字符,则出现另一个。其中一个单元格的行高大于第二个单元格的行高
我有一个弹出窗口,弹出窗口内部是一个相机按钮,我的相机工作正常,但顶部的电池符号与相机重叠,下面是屏幕截图。 如果有人知道答案,我们将不胜感激。 最佳答案 您可以隐藏该 View 的状态栏,这样它就不
有没有办法从 Android SDK 获取电池信息?比如剩余电池生命周期等等?我无法通过文档找到它。 最佳答案 这是一个简单的示例,可以让您了解电池的使用量、电池电压和温度。 将以下代码粘贴到 Act
我想删除状态栏(显示时间和电池状态)。就像在涂鸦跳跃或其他游戏中一样。 我怎样才能做到这一点? 谢谢 :) 最佳答案 http://iphonesdkdev.blogspot.com/2008/06/
已经阅读了关于同一主题的其他 SO 帖子,并且在以下方法之间做出决定: Thread 1与 Thread 2与 simple onLocationUpdate() 有人可以帮助我了解所有这些的利弊吗?
最近 google 推出了推送到设备服务,但它仅适用于 2.2 及更高版本。 我的应用程序中需要一个类似的系统,并且我正在尝试绕过限制。 问题是电池生命周期。由于必须立即通知用户有关服务器上的更改,我
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。 6
我有两个原型(prototype) TableViewCells。现在,一个只是另一个的复制粘贴。 BasicCell 和 BasicCell2 。我刚刚为 BasicCell2 复制了 BasicC
我目前正在为 iPhone 开发一个聊天客户端。服务器端有一个带有 Socket.IO 的 node.js,在 iPhone 上有一个 Socket.IO 客户端( https://github.co
所以我发现没有公开的方法来获取 watchKit 中的电池电量。 所以没有UIDevice.currentDevice().batteryLevel和WKInterfaceDevice不接缝有货。 在
由于 Google 在其网站上提供了适用于 Android L 的更新 SDK。我一直在尝试测试新的电池历史记录功能。 Google API 概述 website声称该工具在 sdk/tools 下可
我已经安装了全新的 Catalina 和 Android Studio。事实证明,当我启动模拟器时,模拟器进程会占用大量 CPU 周期。查看 adb shell 中的 top,我得到了一些我不理解的进
我修复了 iOS 7 的问题,导航栏是重叠 TableView 。 我用这个代码 //for help navigation bar overlap if ([self respondsToSelec
今天,小爱同学官微发布消息宣布,Redmi 小爱触屏音箱 Pro 正式推出,该机搭载 8 英寸屏幕,配备电池可不用时刻连接电源,售价 499 元,新品将于 9 月 9 日 0 点正式开售。 作
我是一名优秀的程序员,十分优秀!