Android进阶之旅(第2天:前台服务与后台服务)

        充实的一天又结束了,先总结下昨天订的目标:

        1.二次进入黑屏bug修复了,这个原因是Resume重新进入没有更换bindToLifeCycle的usecase

        2.看了前台服务以及通知的文档,并且成功实现

        3.过了一下bug,帮前辈点了一个解决

        4.毕设bug修复啦哈哈(不过发现了新的bug)

        那么总结下今天的成果:

        1.看前台服务与通知的文档

        2.加入前台服务保活,理解前台服务与后台服务的区别

        3.测试8-14的功能是否正常使用

        4.学习通知权限申请

        首先是1,对应的是这两个文档,今天就不一个一个截图了:

https://developer.android.com/develop/background-work/services/foreground-services#purpose-built-apis

https://developer.android.com/develop/ui/views/notifications

        首先是前台服务,它与通知栏绑定,也就是Notification绑定,经过看书与文档,写了一个很简单的前台服务:

   override fun onCreate() {
        super.onCreate()
        Log.d(TAG,"OnCreate")
        createNotificationChannel()
        val notification = createNotification()
        startForeground(NOTIFICATION_ID,notification)


    }

    private fun createNotificationChannel() {
        val notifyMgr = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        val channel = NotificationChannel(notificationChannelId,getString(R.string.app_name),NotificationManager.IMPORTANCE_DEFAULT)
        notifyMgr.createNotificationChannel(channel)
    }

    private fun createNotification(): Notification? {
        val message = "后台相机正在运行中"
        val intent = Intent(this,MainActivity::class.java)
        val clickIntent = PendingIntent.getActivity(this,R.string.app_name,intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
        val builder = Notification.Builder(this, notificationChannelId)
        builder.setContentIntent(clickIntent)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("后台相机")
            .setContentText(message)
        return builder.build()
    }

如果你学过前台服务,那么你会发现我写的就是入门级别,所以也没有什么机密,直接放出来了哈哈

这个需要注意的有3点,一个是我学习的时候就知道的,还有两个是坑

首先第一点,13及以后,PendingIntent的FLAG需要加伤IMMUTABLE或者MUTABLE,具体可见Android13的变化,也就是直接文档,我这里放出我用的文档地址,所有的相关文档都是这里搜的:https://developer.android.com/?hl=zh-cn

然后第二点是,NotificationChannel的CHANNELID与NotificationBuilder的id需要一致

你可能会问这俩是啥,于是就是第三点,NotificationChannel

你可能会先问这是个啥,我的评价是看图:

你可能又问notification是啥,我的评价是去看文档,你可能会说我就是看不懂文档才来看优快云

我的评价是,优快云不能给你答案,GPT不能给你答案的时候,Google文档一定可以给你答案

所以建议多看文档,不知道怎么看就一点一点看,因为我也是一点一点看的,越看觉得文档好厉害

至于英文,建议搞个插件翻译

好了前台服务的使用我说完了,代码也讲完了,你可能说你还是不懂,巧了,我也不是很懂,也就会这么点,接下来是今天花费了我很久理解的:前台服务与后台服务

如果你学过这两个,还搞懂了,我只能说牛皮,我看了好久的文档,问了好几个前辈,问了gpt,还问了stackflower,才勉强搞懂

接下来首先说下我的理解:

经过我一天的沉淀,有以下理解:

/*理解一下Service与前台service关系:

1.service可以用bindService或者startService来启动,前台Service使用startForegroundService

2.前台service必须绑定Notification或小部件,后台service不需要

3.前台service更能保活,但是他与后台的有什么关系

你可能说,你个xx,你的理解还有问题”/

好吧这是我下午迷茫中的笔记,与其类似的还有:

/*

遇到两个问题:

1.前台服务正常运行,音量监听成功接收,但是拍照似乎无法正常拍摄,目前好像又没了

2.二次切入黑屏的问题

3.如何验证保活

4.通知栏权限引导弹窗*/

/*接下来需要解决的问题:

1.通知权限引导弹窗

2.6-14机型验证(存储以及后台拍摄)*/

//33版本如果没有给通知权限,后台拍摄无法正常进行

等等,这些都是我随笔记录的问题,后续都有了解决

写这些一半是为了介绍下我的思考历程,另一半是水一水

好了扯远了,回来介绍我的理解(仅个人理解)

1.前台service与后台service都可以用startService或者bindService来进行启动

2.后台service可以通过startForeground来升级为前台服务(必须有通知栏才说明成为了前台服务,不然他还是一个后台服务)

3.前台服务比后台服务更稳定,能活更久

目前我的理解也就到这里,更深一点的东西也有一点认知,但是没有特别明白,就不在这瞎搞了

然后是不同版本的验证

主要是两个问题:

1.10验证有问题(师傅的乐檬K12Pro)(权限引导弹窗也可正常拉起):后台拍照报错:


15:38:31.390  E  Photo capture failed: Not bound to a valid Camera [ImageCapture:androidx.camera.core.ImageCapture-5ab565ef-967e-4e5e-a361-5e543341009b]
                 androidx.camera.core.ImageCaptureException: Not bound to a valid Camera [ImageCapture:androidx.camera.core.ImageCapture-5ab565ef-967e-4e5e-a361-5e543341009b]
                 	at androidx.camera.core.ImageCapture.lambda$sendImageCaptureRequest$5$androidx-camera-core-ImageCapture(ImageCapture.java:1189)
                 	at androidx.camera.core.ImageCapture$$ExternalSyntheticLambda4.run(Unknown Source:4)
                 	at android.os.Handler.handleCallback(Handler.java:883)
                 	at android.os.Handler.dispatchMessage(Handler.java:100)
                 	at android.os.Looper.loop(Looper.java:241)
                 	at android.app.ActivityThread.main(ActivityThread.java:7582)
                 	at java.lang.reflect.Method.invoke(Native Method)
                 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
                 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:944)

这个是今天下午最恶心的bug,我真的用尽所有手段,没有找到原因所在

最好还好我把问题定位出来了,是音量监听出了问题,进入后台bindLifeCycle的lifeCycleOwner直接爆destory,我直接人傻了

为啥那么多都没问题,就这一个有问题

走投无路下去问了前辈,还是那句话,前辈不愧是前辈

他只说了一句话:你是不是没关不保留活动

果然,一语成戳,直接fix

你可能会问什么是不保留活动

建议去看文档,不过我的理解就是你退出程序正常是Stop,开了这个直接就Destory了

但是比较奇怪的是开完退出后你在后台能看见他,但是他其实已经死了

2.这个是系统报错,26以下不让用什么东西,我直接粘过来:

AAPT: error: <adaptive-icon> elements require a sdk version of at least 26.

两个系统生成的xml爆这个错误,搞了一会没解决,我一怒之下直接给他删了,换了张图

不错,正是他,他甚至命名是download,这是我之前学习的时候用的图片

然后成功运行,至于因为换了图片我找不到他了,相对于bug来说都是小事了

好了,今天的学习大概也就这么多,那么来规矩明天计划走起:

                        1.测试剩余的6.0和7.0

                        2.看前台Service与通知的文档

                        3.看看有没有什么可以帮前辈忙的

                现在是19:37分,再学习一会,一会就准备回去搞点晚饭吃,日常期待开学回学校吃饭

                锻炼下班睡觉常驻不再赘述,祝大家也能享受每一天

                最后放下封面,分享一张老婆哈哈哈

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值