当前位置: 首页 > 知识库问答 >
问题:

华为,荣誉手机电池优化,前台服务

闾丘博
2023-03-14

这个问题可能看起来很宽泛,但我会尽量简短地总结一下。

如何在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
    )
}
}

共有1个答案

石博艺
2023-03-14

也许问题是您在调度警报时没有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 问项目的难点,为什么做这个项目。 实习做了什么,难点。 主管二面: 全程聊天。