美文网首页
安卓组件之 Service

安卓组件之 Service

作者: anloney | 来源:发表于2019-05-31 22:41 被阅读0次

    正常情况下启动一个 Service 有两种方式,一是mContext.bindService(),一是 mContext.startService() 。两种方式有不同的生命周期和结束方式,接下来简明介绍一下。

    先看下两种方式的生命周期流程图:

    总结下就是 startService 方式的过程是在某个需要开启服务的地方调用 startService(),然后 service 开始启动,执行 onCreate() -》onStartCommand() ,此时如果在外部调用 stopService() 或者 stopSelf() 则服务停止运行,执行 onDestory() 方法,其中 onStartCommand() 方法是原来的 onStart() ,由于 onStart() 是过时的方法,所以现在用 onStartCommand() 。其中 onCreate() 方法只能执行一次,也就是说当一个 service 启动后,在调用 startService() 也不会执行 onCreate() 只会执行 onStartCommand(),也就是 onStartCommand() 可以被执行多次,所有 service 的生命周期里只有这个方法会执行多次,其他都是只执行一次,不管 service 是否启动。

    然后 bindService() 的过程是 onCreate() -》onBind() ,然后外部调用 unbindService()方法,service 继续执行 onUnbind() -》 onDestory() 结束。这里 bindService() 方法里可以获取成功连接 service 后返回的一个 IBinder 对象,通过这个对象可以调用 service 里的函数和方法,所以这种方式可以实现操作 service 里的方法,但是 startService() 这种方式不能做到。

    特别注意,startService() 开启的 service , 调用者退出后, service 仍能运行,但是 bindService 开启的 service 调用者退出后 Service 随着调用者一起销毁,可以从字面意思理解,也就是 bindService 方式 Service 和调用者绑定到了一起,同时存在或销毁。

    也可以同时调用两种方式开启一个 Service ,此时关闭 Service 需要调用 unbindService 和 stopService(stopSelf)两个方法才能正常关闭当前 Service。

    上述介绍的启动方法针对的是普通的 Service ,在安卓里还有其他三种 Service ,分别是前台 Service、系统 Service 和 intentService。

    • 前台服务

    前台服务和普通服务最大的区别是,前者会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。使用前台服务或者为了防止服务被回收掉,比如听歌,或者由于特殊的需求,比如实时天气状况。

    想要实现一个前台服务非常简单,它和之前学过的发送一个通知非常类似,只不过在构建好一个Notification之后,不需要NotificationManager将通知显示出来,而是调用了startForeground()方法。如下代码是在 MyService 里的 onCreate() 方法里写的:

    //使用前台服务 Notification.Builder builder = new Notification.Builder(this);
    builder.setSmallIcon(R.mipmap.ic_launcher);
    builder.setContentTitle("服务通知标题");
    builder.setContentText(message);
    builder.setWhen(System.currentTimeMillis());
    Notification notification1 = builder.build();
    startForeground(10,notification1);
    
    
    • 系统服务

    比如之前接触过的NotificationManage。通过getSyetemService()方法并传入一个Name就可以得到相应的服务对象了,常用的系统服务如下表:

    • intentService

    为了可以简单地创建一个异步的、会自动停止的服务,Android 专门提供了一个IntentService类。它的使用和普通Service非常像,下面来学习一下:

    第一步:新建类并继承IntentService,在这里需要提供一个无参的构造函数且必须在其内部调用父类的有参构造函数,然后具体实现 onHandleIntent()方法,在里可以去处理一些耗时操作而不用担心 ANR的问题,因为这个方法已经是在子线程中运行的了。
    第二步:在配置文件中进行注册。
    第三步:在活动中利用Intent实现IntentService的启动,和Service用的方法是完全一样的。

    Service与Activity的通信

    Service 和 Activity 通信需要服务的 onBind() 方法。通过定义一个 MyBinder 类继承 Binder ,在 Service 的 onBind 方法返回这个定义的 MyBinder 类,然后需要调用的地方通过 bindService(this,serviceConnect,BIND_AUTO_CREATE) 方法中的serviceConnection 里的 onServiceConnected 返回的一个 IBinder 调用Service 里的方法或参数,这样就实现了通信。具体可以参考另一篇使用 AIDL 和 Binder 实现 JNI (进程间通信)的例子

    相关文章

      网友评论

          本文标题:安卓组件之 Service

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