Android 题集四大组件之 Service
3、使用 Context 的 startService(Intent)方法启动该 Service
4、不再使用时使用 stopService(Intent)方法停止该服务
每次通过 startService(Intent)方法启动 Service 时都会调用。其中我们可以注意 onStartCommand 是有返回值的。
START_STICKY:如果 service 进程被 kill 掉,保留 service 的状态为开始状态,但不保留递送的 intent 对象。随后系统会尝试重新创建 service,由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到 service,那么参数 Intent 将为 null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传 Intent。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。
START_STICKY_COMPATIBILITY:START_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启。
OnDestroy:在 Service 销毁时调用,可在此回收一些资源。
在 bindService 中
步骤:
1、定义一个类继承 Service,创建一个继承与 Binder 的实例对象,并提供公共方法供客户端调用。
2、实现 onBind()方法,返回 Binder 实例
3、在 Manifest.xml 文件中配置该 Service
4、在客户端中,实现 ServiceConnection 实例,从 onServiceConnected()回调方法接收 Binder,并使用 bindService 绑定服务。
注:onServiceDiscounnection 方法是在服务崩溃或者服务杀死导致的连接中断时调用
首先会调用 onCreate,然后调用 onBind 方法,然后在 Activity 与 Service 解绑时调用 Unbind 方法,最后在所有 Activity 与 Service 解绑后,该 Service 会销毁,并调用 onDestroy 方法。 onBind:绑定服务才会调用,但注意即使我们用 startService 也要实现该方法。
一个 Service 可以被多个客户进行绑定,只有所有的绑定对象都执行了 onBind()方法后该 Service 才会销毁,不过如果有一个客户执行了 onStart()方法,那么这个时候如果所有的 bind 客户都执行了 unBind()该 Service 也不会销毁。
混合使用
在这之前,要知道一个原则是 Service 的 onCreate 的方法只会被调用一次,就是你无论多少次的 startService 又 bindService,Service 只被创建一次。
如果先是 bind 了,那么 start 的时候就直接运行 Service 的 onStart 方法,如果先是 start,那么 bind 的时候就直接运行 onBind 方法。
如果 service 运行期间调用了 bindService,这时候再调用 stopService 的话,service 是不会调用 onDestroy 方法的,service 就 stop 不掉了,只能调用 UnbindService, service 就会被销毁
如果一个 service 通过 startService 被 start 之后,多次调用 startService 的话,service 会多次调用 onStart 方法。多次调用 stopService 的话,service 只会调用一次 onDestroyed 方法。
如果一个 service 通过 bindService 被 start 之后,多次调用 bindService 的话,service 只会调用一次 onBind 方法。多次调用 unbindService 的话会抛出异常。
混合使用时的生命周期
可以,弹吐司有个条件就是得有一个 Context 上下文,而 Service 本身就是 Context 的子类,因此在 Service 里面弹吐司是完全可以的。
可以直接在 Service 中 onStartCommand()方法中可以执行网络操作,service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 ),如果需要在服务中进行耗时操作,可以选择 IntentService, IntentService 是 Service 的子类,用来处理异步请求。
IntentService 是 Service 的子类,比普通的 Service 增加了额外的功能。
Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中;
Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务;
IntentService 的特征
会创建独立的 worker 线程来处理所有的 Intent 请求;
会创建独立的 worker 线程来处理 onHandleIntent()方法实现的代码,无需处理多线程问题;
所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf()方法停止 Service;
为 Service 的 onBind()提供默认实现,返回 null;
为 Service 的 onStartCommand 提供默认实现,将请求 Intent 添加到队列中;
在一个 app 的情况下,默认是在同一个线程中的,main Thread (UI Thread)。
Thread 是程序运行的最小单元——线程。
Service 是安卓的一种机制,运行在主线程,因此在 Service 中进行耗时操作也需要开启新的线程。 那为什么还要 Service 不在 Activity 中直接操作 Thread 呢? 因为 activity 很难对 Thread 进行管理,当 activity 销毁了,之后的 activity 就没办法获取到之前创建的 Thread。
进程的重要性依次是:前台进程、可见进程、服务进程、后台进程、空进程。所以销毁的顺序为逆方向。
在 AndroidManifest.xml 文件中对于 intent-filter 可以通过 android:priority = “1000”这个属性设置最高优先级,1000 是最高值,如果数字越小则优先级越低,同时实用于广播。
在 onStartCommand 里面调用 startForeground()方法把 Service 提升为前台进程级别,然后再 onDestroy 里面要记得调用 stopForeground ()方法。
onStartCommand 方法,手动返回 START_STICKY。
在 onDestroy 方法里发广播重启 service。
service +broadcast 方式,就是当 service 走 ondestory 的时候,发送一个自定义的广播,当收到广播的时候,重新启动 service。(第三方应用或是在 setting 里-应用-强制停止时,APP 进程就直接被干掉了,onDestroy 方法都进不来,所以无法保证会执行)
监听系统广播判断 Service 状态。 通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的 Service 是否还存活。
Application 加上 Persistent 属性。
Activity、Intent、Service 是什么关系?
他们都是 Android 开发中使用频率最高的类。其中 Activity 和 Service 都是 Android 四大组件之一。都是 Context 类的子类 ContextWrapper 的子类, 因此他俩可以算是兄弟关系吧。不过兄弟俩各有各自的本领,Activity 负责用户界面的显示和交互,Service 负责后台任务的处理。Activity 和 Service 之间可 以通过 Intent 传递数据,因此可以把 Intent 看作是通信使者。
ActivityManagerService 了解吗?有什么作用?
ActivityManagerService 是 Android 中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似;
评论