充实的一天又结束了,先总结下昨天订的目标:
1.二次进入黑屏bug修复了,这个原因是Resume重新进入没有更换bindToLifeCycle的usecase
2.看了前台服务以及通知的文档,并且成功实现
3.过了一下bug,帮前辈点了一个解决
4.毕设bug修复啦哈哈(不过发现了新的bug)
那么总结下今天的成果:
1.看前台服务与通知的文档
2.加入前台服务保活,理解前台服务与后台服务的区别
3.测试8-14的功能是否正常使用
4.学习通知权限申请
首先是1,对应的是这两个文档,今天就不一个一个截图了:
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分,再学习一会,一会就准备回去搞点晚饭吃,日常期待开学回学校吃饭
锻炼下班睡觉常驻不再赘述,祝大家也能享受每一天
最后放下封面,分享一张老婆哈哈哈