这个问题可能看起来很宽泛,但我会尽量简短地总结一下。
如何在ANDROID o中处理后台服务?
如何在华为设备上关闭电池优化
如何在华为设备上关闭电池优化
华为EMUI 4.0+上的电池优化(wakelocks)
当应用程序在华为设备上消失时,服务被扼杀
Oreo(8.1)无法在锁定屏幕上启动活动
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)
当前的解决方案可以工作多年,这要归功于使设备保持清醒。 Android6.0+中的打瞌睡模式情况复杂,但事实并非如此。 在华为设备上可能是不同类型的优化。 正如我在start上写的,除了新的华为,在所有其他设备上,这样的系统可以正确工作多年。 编辑:注意:在一位用户评论后(已删除?),华为电池管理器中的“白名单”应用程序(标记为“受保护应用程序”)对此问题没有影响。
荣誉是自由软件世界的主要货币。无论人们怎样说他参与项目的动机,我不知道有哪个开发者会乐于匿名,或以其他人的名义的做这些事。有一些有形的原因:一个人在一个项目的名声大体上决定了他的影响力,参与一个开源项目也会间接的带来金钱,因为某些雇主希望寻找简历。也有一些无形的原因,或许更加强大:人们只希望被赏识,本能的寻找被别人识别的标志。荣誉的希望是项目一个最重要的动机。当小的贡献被认可,人们会返回作出更多。
#24届软开秋招面试经验大赏# 投递岗位:AI平台/性能优化工程师 笔试时间:9.11 120min 笔试一共3道编程题,100分,200分,300分 第1题:给定一个字符串A和一个字符串B,找出B比A多出现一次的字符,不难,直接秒了 第2题:出租车接客,类似于是给你一系列点构成一个封闭区域,要你判断给定的一个点在不在封闭区域内 第3题:有个数限制的背包问题。3种价值的物品,每种物品有个数限制,给
#24届软开秋招面试经验大赏# 投递岗位:AI平台/性能优化工程师 面试时间:9.22 面试流程 30min 视频面试 1、自我介绍 2、挑一个项目介绍难点与收获 3、对自己的评价 4、最有成就感的一件事 5、你在项目团队中扮演什么角色 6、如果你在工作中很努力,但是年底绩效考核不行,你会怎么办 7、反问 二面是综合面,提前准备好一些hr类型的问题,免得到时候卡壳
技术一面: 先手撕题,中等难度。(脑子抽了把题看错了,面试官提醒后改对了)。 线程协程进程的区别。pthread的线程和C++里面的线程有什么关系。 C++的内存管理。SGI内存池是怎么设计的。(我是共享屏幕画图讲的,侯捷老师的STL源码剖析上有讲) 内存泄漏是什么,有什么方法可以定位内存泄漏吗。 Golang的GC 问项目的难点,为什么做这个项目。 实习做了什么,难点。 主管二面: 全程聊天。