持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
安卓开发
安卓四大组件之Service
什么是Service:
service用来实现安卓后台任务。一般用于不需要和用户交互且需要长时间保持存活的任务(比如后台下载,音乐播放等功能)。
注意:Service本身并不会开启一个新的线程,它运行在当前APP进程的主线程之中。你可以在其中开启子线程。
Service主要周期:
Service有两种启动方式分别对应着不同的生命周期:
-
由Activity直接启动Service实例,启动之后和Activity之间并没有太多联系,相当于两个独立的个体。生命周期如下:
onCreate() -> onStartCommand()-> onDestory()
-
通过和Activity之间进行绑定,二者之间会存在绑定关系,可以分享数据,当Activity销毁时,绑定的Service也会被销毁。
onCreate() -> onBind() -> onUnbind() -> onDestory()
Service和Activity
关联
-
startService(intent)
二者之间不会有太多的关联,活动销毁,service不会销毁
-
bindService(intent,serviceConnection,flages)
二者绑定关联,活动销毁,service自动销毁: ->onUnbind() ->onDestory()
解除关联:
-
stopService(intent)
-
unbingService(serviceConnection)
两种方法互不干扰,可以单独绑顶和解绑
Service实例是全局的,可以和其他Activity进行绑定。但是和Activity的关联关系是独立的。
问题Q:
1.在执行unbindservice(serviceConnection)时,如果此时Activity并没有和Service进行绑定就会报错:
java.lang.IllegalArgumentException:
Service not registered: com.example.demo.MainActivity$1@c485492
原因可能是因为Activity没有和Service绑定,所以在取消绑定时一定要判断二者是否绑定。
前台Service的创建
创建通知 Notifycation
远程Service
1.在Mainfest文件中的
<service android:process = ":xxx"
注意需要在xxx进程名前加上 ":"号 表示在当前包名路径下创建进程
2.创建AIDL接口,在Service中实现,在Activity中调用。
3.隐式意图----另一个应用访问Service
问题:**在安卓5.0之前是可以的,但是安卓5.0之后不允许隐式启动Service需要设置显示意图。需要设置Component使得意图变为显示意图。
4.设置intent.Component访问其他应用的Servce **真机测试安卓8.0可以实现,但是虚拟机11.0系统时失败。