美文网首页
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关系

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