Android启动前台服务(startForegroundService)

这篇具有很好参考价值的文章主要介绍了Android启动前台服务(startForegroundService)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题:

APP in background in null uid
AndroidRuntime: android.app.RemoteServiceException: Context.startForegroundService()
 did not then call Service.startForeground():

注意事项:

  • 8.0适配:通知需要加上NotificationChannel,开启前台服务的方式startForegroundService()
  • 9.0适配:manifest.xml文件中需要增加权限:FOREGROUND_SERVICE

Android之 Service服务详解

1、前台权限:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

2、Service中开启通知:

class LogUploadService : Service() {

    override fun onBind(arg0: Intent): IBinder? {
        return null
    }

    override fun onCreate() {
        super.onCreate()
        Log.d("caowj", "LogUploadService onCreate")
        initNotification()
    }

    private fun initNotification() {
        val channelName = "埋点上传"
        val channelId = BuildConfig.APPLICATION_ID

		// 发送通知,把service置于前台
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        // 从Android 8.0开始,需要注册通知通道
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH)
            notificationManager.createNotificationChannel(channel)
        }
        val notification = NotificationCompat.Builder(this, channelId)
            .setSmallIcon(R.mipmap.app_icon)
            .setContentTitle("埋点Log上报")
            .setContentText("服务正在运行,请勿关闭")
            .setAutoCancel(false)
            .setOngoing(true)
            .build()
        // 注意第一个参数不能为0
        startForeground(1, notification)
    }

    override fun onDestroy() {
        //停止的时候销毁前台服务。
        stopForeground(true);
    }
}


3、启动Service:

// Android 8.0使用startForegroundService在前台启动新服务
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(Intent(this, LogUploadService::class.java))
} else {
    startService(Intent(this, LogUploadService::class.java))
}

Android O对后台Service限制怎么解决

4、其他方案:

由于从Android 8.0开始禁止应用在后台运行时创建Service,所以要解决这种这种问题有以下几种方案:

  • 通过Context.startForegroundService()方式启动一个前台Service,前台Service的启动没有受到限制。
  • 集成Google Firebase Messaging。
  • 使用JobService;最小周期时长为 15 分钟
  • WorkManager: 周期性任务;最小周期时长为 15 分钟 (与 JobScheduler 相同)

官方建议使用JobScheduler 替换 后台Service。

从Android 8.0,使用JobScheduler替换后台Service,它会周期性启动一个任务,查询服务器,然后退出。相比于后台Service,它消耗的资源明显较少,间接提升了手机性能。

问题补充:

JobService 最小间隔时间要求大于15分钟;否则报错:

Requested interval +1m0s0ms for job 10 is too small; raising to +15m0s0ms   
Requested flex +1m0s0ms for job 10 is too small; raising to +5m0s0ms        

WorkManager: 周期性任务

5、JobScheduler实现定时间隔处理

Android之任务调度WorkManager和JobSchedule的使用

通过递归的方式,解决最小间隔时间要求大于15分钟的限制;

/**
 * JobScheduler实现定时间隔处理
 * 通过递归的方式,在onStartJob中,利用setMinimumLatency来设置时间间隔,执行完后再重新创建启用任务来实现
 */
class PeriodicJobService : JobService() {

    override fun onStartJob(p0: JobParameters?): Boolean {
        Log.i(TAG, "onStartJob---")
        startScheduler(this)
        return false
    }

    override fun onStopJob(p0: JobParameters?): Boolean = false

    companion object {
        var TAG: String = "caowj"
        var JOBID: Int = 100
        var InterValTime: Long = 10000
        private var jobScheduler: JobScheduler? = null
        private var jobInfo: JobInfo? = null

        fun startScheduler(context: Context) {
            jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
            cancelScheduler()
            if (jobInfo == null) {
                jobInfo = JobInfo.Builder(JOBID, ComponentName(context, PeriodicJobService::class.java))
                    .setMinimumLatency(InterValTime) // 最小为10秒
                    .build()
            }
            val result = jobScheduler?.schedule(jobInfo!!)
        }

        fun cancelScheduler() {
            jobScheduler?.cancel(JOBID)
        }
    }
}

需要提醒:文章来源地址https://www.toymoban.com/news/detail-568583.html

  • JobScheduler和WorkManager都只能在APP存活的时候执行,但是定时器是一直工作的。
  • 关闭APP再启动,JobScheduler并不能够直接继续运行,但是WorkManager可以。
  • 如果重启APP的时候,WorkManager任务的计时器应该已经执行了一次或多次,则会立即开始执行。
  • 重启App之后WorkManager如果直接执行了一个任务,则从这个时候开始算新的周期,不会按旧有周期走。

到了这里,关于Android启动前台服务(startForegroundService)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android app保活(前台服务)

    国内厂商定制,除非厂商给app白名单,否则只能用户手动添加白名单(应用自启和后台运行),才能通过前台服务实现app保活。 这里介绍前台服务相关实现方式。 开启服务: 服务: 清单文件

    2024年02月09日
    浏览(41)
  • Android14前台服务适配指南

    Android 10引入了 android:foregroundServiceType 属性,用于帮助开发者更有目的地定义前台服务。这个属性在Android 14中被强制要求,必须指定适当的前台服务类型。以下是可选择的前台服务类型: camera : 相机应用。 connectedDevice : 与连接的设备相关的应用。 dataSync : 数据同步应用。

    2024年01月22日
    浏览(40)
  • Android service(服务)中的前台服务

    紧接上文 概述 前台服务是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。前台服务必须为状态栏提供通知,将其放在运行中的标题下方。这意味着除非将服务停止或从前台移除,否则不能清除该通知。 针对上一篇文章中的案例我们可以发现,系

    2024年02月14日
    浏览(39)
  • Android入门教程 | 四大组件之Service(前台服务,后台服务)

    Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可在后台处理网络事务、播放

    2024年02月05日
    浏览(53)
  • Android进程类型及优先级(前台进程/可见进程/服务进程/缓存进程/空进程)

    Android 进程优先级 :前台进程 可见进程 服务进程 缓存进程 空进程 ; 关键优先级进程 : 活动进程 ; 高优先级进程 : 可见进程 , 服务进程 ; 低优先级进程 : 后台进程 , 空进程 ; Android 系统中会尽量保证优先级高的进程的存在时间尽可能长 ;如果资源不足 ( 这里的资源最主要的是内

    2024年04月12日
    浏览(36)
  • 车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动

    注意:本文基于 Android 11/R 进行分析 Qidi 2023.11.28 (MarkDown Haroopad) Overlay 实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。 Android 提供了两种实现方式: 编译时:https://source.android.com/docs/setup/create/new-device#use-resource-overlays 运行时:https://source.android.c

    2024年02月05日
    浏览(41)
  • Android移动应用开发——开灯与关灯(小兔子)——实验八——服务的启动与关闭

        掌握布局和基本控件的属性功能及使用方法     掌握startService()方法与stopService()方法启动和关闭服务 通过线性布局和相对布局来搭建一个界面,界面效果如下图所示。当点击“关灯”按钮后,转变到第二个状态。在第二个状态中,点击“开灯”按钮后,跳转回第一

    2024年02月05日
    浏览(53)
  • android服务启动失败Unable to start service Intent U=0: not found

    android启动服务失败,提示:Unable to start service Intent { cmp=xxx/.xxx} U=0: not found。检查清单文件服务配置没有错,启动服务的方法也没错。 场景:我的程序是系统应用,运行于9.0,作为launcher使用,在application onCreate中启动服务。试过延迟启动服务和配置action和Package的方式启动服

    2024年02月11日
    浏览(52)
  • 【Android平板编程】远程Ubuntu服务器code-server编程写代码

      本次教程将在 Ubuntu 服务器环境下安装 code-server ,并使用 Android 安卓平板远程 Ubuntu 服务,进行远程编程开发写代码。同时搭配 cpolar 内网穿透工具,实现公网环境下异地远程访问Ubuntu的code-server。   准备一台虚拟机,Ubuntu或者centos都可以,这里以 VMwhere ubuntu 系统为例  

    2023年04月14日
    浏览(44)
  • 【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发

    准备一台虚拟机,Ubuntu或者centos都可以,这里以VMwhere ubuntu系统为例 下载code server服务,浏览器访问:https://github.com/coder/code-server,复制下载链接 打开ubuntu命令行下载 出现需要输入ubuntu的登录账户密码,输入密码即可,然后等待安装完成 以下信息表示安装成功 接着输入以下命

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包