美文网首页
Service(三) - Service和Thread关系

Service(三) - Service和Thread关系

作者: 世道无情 | 来源:发表于2019-01-27 16:23 被阅读0次

1. Service和Thread关系


Thread:
用于开启子线程,在里边执行耗时操作,不会阻塞主线程;
Service:
1>:Service 与 MainActivity一样,都是运行在主线程;
2>:Service 用于处理后台任务,由于 Service运行在主线程,如果执行耗时操作,会ANR,可以在 Service中 开启子线程,就可以处理后台的 耗时任务;
3>:后台指的是: 它的运行完全不依赖UI,即使 Activity被销毁、或者程序关闭,只要进程还在,Service就能运行。比如一些需求:需要与服务器之间一直保持心跳连接,就可以用 Service,直接在 Service中 开启子线程即可;

2. 为什么在Service开启 子线程?


同样是开子线程,为什么要用 Service而不用 MainActivity,原因是:
Activity销毁后,不能获取到之前创建的 Thread实例,而且 Activity中创建的 Thread实例,其他Activity不能对其操作;

但是 Service就不一样:
因为 所有 Activity都可以与 Service关联,即使 Activity销毁,只要 调用 bindService 重新 与 Activity 绑定,就可以 获取到 Service中的 Binder 实例,直接处理后台逻辑,Activity只管 finish,不用管后台执行的任务;

代码如下:

/**
 * ================================================
 * Email: 2185134304@qq.com
 * Created by Novate 2018/12/18 15:09
 * Version 1.0
 * Params:
 * Description:
 * 备注:任何一个 Service在整个应用程序范围内都是通用的,也就是说 MyService 不仅可以和ServiceActivity关联,
 *       还可以和任何一个Activity关联,而且在关联时都可以获取到相同的 MyBinder实例
 * ================================================
*/

public class MyService extends Service {

    // 自己自定义MyBinder继承Binder
    private MyBinder mBinder = new MyBinder() ;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("TAG" , "onCreate__executed") ;
        // 主线程 
        Log.e("TAG" , "MyService thread id is " + Thread.currentThread().getId()) ; 
    }


    /**
     * 在 MyService 中开启子线程
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("TAG" , "onStartCommand__executed") ;

        new Thread(new Runnable() {
            @Override
            public void run() {
                // 开始执行后台任务
            }
        }).start();

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("TAG" , "onDestroy__executed") ;
    }


    /**
     * Activity 与 Service关联,返回MyBinder实例对象:
     *      用于在 Activity中,通过onServiceConnected方法,指定 Service执行相关任务
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }


    class MyBinder extends Binder{

        /**
         * 自己自定义MyBinder继承Binder,然后随便定义一个方法,
         * 用于在后台执行下载任务,这里只是做一个测试
         */
        public void startDownload(){
            // 模拟在后台下载任务
            Log.e("TAG" , "startDownload__模拟在后台下载任务") ;

            new Thread(new Runnable() {
                @Override
                public void run() {
                    // 执行具体的下载任务
                }
            }).start();
        }
    }
}

相关文章

  • Service(三) - Service和Thread关系

    1. Service和Thread关系 Thread:用于开启子线程,在里边执行耗时操作,不会阻塞主线程;S...

  • Service

    1. Service应用场景及 Service和Thread的区别 (1) what is Service(应用场...

  • Android 拾遗(三) Service

    Service 的应用场景以及和 Thread 的区别service 是什么 Service(服务)是一个可以在...

  • Service面试详解

    一.service的应用场景,以及和Thread区别 1.service是什么? service(服务)是一种可以...

  • Service面试详解

    1、Service应用场景,以及和Thread的区别 1.1Service是什么? Service(服务)是一种可...

  • 2.3基础知识-Service

    Service详解 1.Service是什么? 2.Service的应用场景,以及和Thread区别 1.定义:T...

  • Service

    Android的Service Service是在main Thread中执行,Service中不能执行耗时操作(...

  • 3 Service相关

    service的应用场景,以及和Thread的区别开启service的两种方式以及区别 1、service是什么?...

  • service和thread区别

    定义 ThreadThread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异...

  • k8s-Service

    Service 存在的意义 Pod与Service的关系 Service定义与创建 Service三种常用类型 C...

网友评论

      本文标题:Service(三) - Service和Thread关系

      本文链接:https://www.haomeiwen.com/subject/xwblkqtx.html