安卓四大组件之Service

262 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

安卓开发

安卓四大组件之Service

什么是Service:

service用来实现安卓后台任务。一般用于不需要和用户交互且需要长时间保持存活的任务(比如后台下载,音乐播放等功能)。

注意:Service本身并不会开启一个新的线程,它运行在当前APP进程的主线程之中。你可以在其中开启子线程。

Service主要周期:

Service有两种启动方式分别对应着不同的生命周期:

  1. 由Activity直接启动Service实例,启动之后和Activity之间并没有太多联系,相当于两个独立的个体。生命周期如下:

    onCreate() -> onStartCommand()-> onDestory()

  2. 通过和Activity之间进行绑定,二者之间会存在绑定关系,可以分享数据,当Activity销毁时,绑定的Service也会被销毁。

onCreate() -> onBind() -> onUnbind() -> onDestory()

Service和Activity

关联

  1. startService(intent)

    二者之间不会有太多的关联,活动销毁,service不会销毁

  2. bindService(intent,serviceConnection,flages)

    二者绑定关联,活动销毁,service自动销毁: ->onUnbind() ->onDestory()

解除关联:

  1. stopService(intent)

  2. 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系统时失败。