• Service


    目录

    1.service两种启动方式

    2.区别

    2.1启动

    2.2销毁

    2.3生命周期

    3.Service生命周期方法

    4.Service与Activity怎么实现通信

    4.1通过Binder对象

    在activity中绑定Service:

    4.2Service通过BroadCast广播与Activity通信

    5.IntentService

    5.1是什么?

    5.2怎么用?

    5.3应用场景

    5.4为什么用?与Service区别


    1.service两种启动方式

    startService
    onCreate() -> onStartCommand() -> onDestroy()
    bindService
    onCreate() -> onbind() -> onUnbind()-> onDestroy()
    应用场景:
    • 如果想要启动一个后台服务长期进行某项任务,那么使用startService
    • 如果只是短暂的使用,那么使用bindService。
    • 如果想启动一个后台服务长期进行任务,且这个过程中需要与调用者进行交互,那么可以两者同时使用,或者使用startService + BroadCast / EventBus等方式
    • 对于既使用startService,又使用bindService的情况,结束服务时需要注意的事项:Service的终止,需要unbindService和stopService都调用才行;

    2.区别

    2.1启动

    startService:如果服务已经开启,多次执行startService 不会重复的执行 onCreate() , 而是会调用 onStart() 和 onStartCommand()。
    bindService:如果服务已经开启,多次执行bindService时 ,onCreate onBind 方法并不会被多次调用

    2.2销毁

    startService:当执行stopService 时,直接调用 onDestroy 方法
    bindService:调用者调用unbindService 方法或者调用者 Context 不存在了(如 Activity fifinish 了), Service 就会调用 onUnbind- >onDestroy

    2.3生命周期

    使用 startService() 方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
    使用 bindService() 方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。

    3.Service生命周期方法

    1 、单独使用 startService & stopService
    (1)第一次调用 startService 会执行 onCreate onStartCommand
    (2)之后再多次调用 startService 只执行 onStartCommand ,不再执行 onCreate
    (3)调用 stopService 会执行 onDestroy
    2 、单独使用 bindService & unbindService
    (1)第一次调用 bindService 会执行 onCreate onBind
    (2)之后再多次调用 bindService 不会再执行 onCreate onBind
    (3)调用 unbindService 会执行 onUnbind onDestroy

    4.ServiceActivity怎么实现通信

    4.1通过Binder对象

    1.Service 中添加一个继承 Binder 的内部类,并添加相应的逻辑方法
    2.Service 中重写 Service onBind 方法,返回我们刚刚定义的那个内部类实例
    3.Activity 中绑定服务 , 重写 ServiceConnection onServiceConnected 时返回的 IBinder Service 中的 binder )调用逻辑方法
    MyService:
    1. public class MyService extends Service {
    2. String msg;
    3. public MyService() {
    4. msg = "Msg from Service";
    5. }
    6. @Override
    7. public IBinder onBind(Intent intent) {
    8. return new MyBinder();
    9. }
    10. public class MyBinder extends Binder{
    11. public String getMsg(){
    12. return msg;
    13. }
    14. }
    15. @Override
    16. public int onStartCommand(Intent intent, int flags, int startId) {
    17. Log.i("Service","Service start");
    18. return super.onStartCommand(intent, flags, startId);
    19. }
    20. }

    在activity中绑定Service:

    1. public class MainActivity extends AppCompatActivity {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_main);
    6. Intent intent = new Intent(this, MyService.class);
    7. startService(intent);
    8. bindService(intent, sc, Context.BIND_AUTO_CREATE);
    9. }
    10. private ServiceConnection sc = new ServiceConnection() {
    11. @Override
    12. public void onServiceConnected(ComponentName name, IBinder service) {
    13. MyService.MyBinder myBinder = (MyService.MyBinder) service;
    14. Toast.makeText(MainActivity.this,myBinder.getMsg(),Toast.LENGTH_SHORT).show();
    15. }
    16. @Override
    17. public void onServiceDisconnected(ComponentName name) {
    18. // 连接出现了异常断开了,MyService被杀掉了
    19. Toast.makeText(getApplicationContext(),"Service被解绑",Toast.LENGTH_SHORT).show();
    20. Log.i("MainActivity","Service被解绑");
    21. }
    22. };
    23. @Override
    24. protected void onDestroy() {
    25. super.onDestroy();
    26. //退出记得解绑Service
    27. unbindService(sc);
    28. }
    29. }

    4.2Service通过BroadCast广播与Activity通信

    5.IntentService

    5.1是什么?

    IntentService Service 的子类,默认开启了一个工作线程 HandlerThread ,使用这个工作线程逐一处理所有启动请求,在任务执行完毕后会自动停止服务。只要实现一个方法 onHandleIntent ,该方法会接收每个启动请求的Intent,能够执行后台工作和耗时操作。
    可以启动 IntentService 多次,而每一个耗时操作会以队列的方式在 IntentService onHandlerIntent 回调方法中 执行,并且,每一次只会执行一个工作线程,执行完第一个再执行第二个。并且等待所有消息都执行完后才终止服务。

    5.2怎么用?

    1. 创建一个名叫 ServiceHandler 的内部 Handler
    2. 把内部 Handler HandlerThread 所对应的子线程进行绑定
    3.HandlerThread 开启线程 创建自己的 looper
    4. 通过 onStartCommand() intent ,依次插入到工作队列中,并发送给 onHandleIntent() 逐个处理

    5.3应用场景

    可以用作后台下载任务 静默上传

    5.4为什么用?与Service区别

    IntentService 会创建独立的 worker 线程来处理所有的 Intent 请求
    Service 主线程不能处理耗时操作,
    IntentService 不会阻塞 UI 线程,而普通 Serveice 会导致 ANR 异常。
    Service onBind() 提供默认实现,返回 null onStartCommand 提供默认实现,将请求 Intent 添加到队列中。
    所有请求处理完成后, IntentService 会自动停止,无需调用 stopSelf() 方法停止 Service
  • 相关阅读:
    【苍穹外卖 | 项目日记】第四天
    【Java八股文总结】之计算机网络
    智能家居生态:华为、小米各异
    【大数据】【Spark】Spark入门
    String类
    【408】计算机组成原理知识点(查漏补缺)
    突破编程_C++_设计模式(备忘录模式)
    Map集合(超详解)
    创意电子学-小知识:如何使用万用表(待修改)
    Qt学习:使用OpenGL绘制3D图形
  • 原文地址:https://blog.csdn.net/qq_14931305/article/details/126287547