美文网首页
组件之Service详解

组件之Service详解

作者: kjy_112233 | 来源:发表于2017-08-04 14:10 被阅读0次

    一、Service详解

    Service的运行不依赖于任何用户界面。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。Service默认并不会运行在子线程中,也不运行在一个独立的进程中,它同样执行在主线程中。

    Service生命周期.png
    (1)生命周期状态
    • onCreate:首次创建服务时调用。服务已在运行,不会调用此方法,该方法只调用一次。
    • onDestroy:当服务不再使用且将被销毁时调用。
    • startService:启动服务
    • onStartCommand:组件通过调用startService()请求启动服务时调用。
    • stopService:关闭服务
    • bindService:绑定服务
    • onBind:组件通过调用bindService()与服务绑定时调用。
    • unbindService:解绑服务
    • onUnbind:组件通过调用unbindService()与服务解绑时调用。
    • onRebind:旧的组件与服务解绑后,新的组件与服务绑定,onUnbind()返回true时调用。

    (2)两种启动Service服务方式

    • 启动Service服务
      单次:startService() onCreate() onStartCommand()
      多次:startService() onCreate() onStartCommand() onStartCommand()
    • 停止Service服务
      stopService() onDestroy()
      无论调用多少次startService()方法,只需调用一次stopService()或stopSelf()方法,服务就会停止了。
    • 绑定Service服务
      bindService() onCreate() onBind()
    • 解绑Service服务
      unbindService() onUnbind() onDestroy()
    • 启动绑定Service服务
      startService() onCreate() onStartCommand() bindService() onBind()
    • 解绑停止Service服务
      unbindService() onUnbind() stopService() onDestroy()
    • 这两种启动方法并不冲突,当使用startService()启动Service之后,还可再使用bindService()绑定,只不过需要同时调用 stopService()和 unbindService()方法才能让服务销毁掉。

    (3)Service使用

    public class MyService extends Service {
        @Override
        public void onCreate() {
            super.onCreate();
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    }
    
    • 在配置文件中进行注册。
    <service android:name=".MyService" />
    
    • 在活动中利用Intent可实现Service的启动。
    Intent intent = new Intent(this, MyService.class);
    startService(intent);
    

    (4)其他Service

    • 前台Service:在MyService的onCreate创建Notification实例,调用startForeground()方法
    • 系统Service:通过getSyetemService()方法并传入一个Name就可以得到相应的服务对象。
      ALARM_SERVICE:闹钟服务
      POWER_SERVICE:电源服务
      KEYAUARD_SERVICE:键盘锁服务
      NOTIFICATION_SERVICE:状态栏服务
      WINDOW_SERVICE:管理打开的窗口程序
      ACTIVITY_SERVICE:管理应用程序的系统状态
    • IntentService:异步的、会自动停止的服务

    (5)Service与Activity的通信

    public class MyService extends Service {
        private MyBinder myBinder = new MyBinder();
    
        @Override
        public void onCreate() {
            super.onCreate();
            System.out.println("执行了onCreate");
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            System.out.println("执行了onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public void onDestroy() {
            System.out.println("执行了onDestroy");
            super.onDestroy();
        }
    
        //返回定义好的MyBinder类
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            System.out.println("执行了onBind");
            return myBinder;
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            System.out.println("执行了onUnbind");
            return super.onUnbind(intent);
        }
    
        //自定义一个类MyBinder并继承Binder,在它的内部提供关联了activity方法
        class MyBinder extends Binder {
            void serviceActivity(){
                System.out.println("Service关联Activity");
            }
        }
    }
    

    Activity代码

    private MyService.MyBinder myBinder;
    //Activity中实例化一个ServiceConnection类
    private ServiceConnection serviceConnection = new ServiceConnection() {
        //服务成功绑定时调用
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myBinder = (MyService.MyBinder) service;
            myBinder.serviceActivity();
        }
    
        //解除绑定时调用
        @Override
        public void onServiceDisconnected(ComponentName name) {
    
        }
    };
    
    //绑定Service
    Intent bindIntent = new Intent(this, MyService.class);
    bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE);
    
    //解绑Service
    unbindService(serviceConnection);
    

    组件之Service源码解析

    相关文章

      网友评论

          本文标题:组件之Service详解

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