美文网首页
Android-Service与Broadcast以及倒计时

Android-Service与Broadcast以及倒计时

作者: 哎呦呦胖子斌 | 来源:发表于2018-06-15 15:41 被阅读0次

    有的没的Service

    程序:为了完成特定任务,用某种语言编写的一组指令集合(一组静态代码)

    进程:运行中的程序,系统调度与资源分配的独立单位,操作系统会为每个进程分配一段内存空间,程序的一席动态执行,经历代码的加载、执行、执行完毕的完整过程。

    线程:比进程更小的执行单元,每个进程可能有多条线程,线程需要存放在一个进程中才能执行,线程由程序负责管理,而进程则由系统进行调度。

    多线程:并行执行多条指令,将CPU时间片按照调度算法分配给各个线程,实际上是分时执行的,只是这个切换的时间很短,用户感觉到“同时”而已。

             Service组件可以实现在后台执行一些耗时任务,甚至可以在程序退出的情况下,让service在后台继续保持运行状态,Service分本地服务和远程服务,本地服务附在主线程上而不是独立的进程,这样在一定程度上节约了资源,远程服务占用独立的进程,由于是独立的进程,因此会占用一定的资源,但在Activity所在的进程被keil的时候,该服务依然在运行,不受其他进程的影响,有利于为多个进程提供服务,具有较高的灵活性,一些提供系统服务的Service就是这种常驻的远程服务。

            继承service的子类在重写service的方法中,除了onStart()方法外,还有一个onStartCommand()方法,在每次调用startService(Intent)时,都会调用该service对象的onStartCommand()方法,然后在里面做一些处理,这个方法有一个返回值:

    START_STICKY:如果service被kill掉,保留service的状态为开始状态,但不保留递送的intent对象,随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand方法,如果在此期间没有任何启动命令被传递到service,那么参数intent将为null;

    START_NOT_STICKY:使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统把它设置为started状态,系统不会自动重启该服务,直到startService方法再次被调用;

    START_REDELIVER_INTENT:重传intent,使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将intent的值传入;

    START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

             Service的两种启动方式:

    Context.startService()方法

             在同一个应用任何地方调用startService()就能启动Service了,然后系统会回调Service的onCreate()方法以及onStart()方法,这样启动的Service会一直运行在后台,直到Context.stopService()或者selfStop()方法被调用,如果一个service已经被启动,其他代码再试图调用startService()方法时不会执行onCreate的,但会重新执行onStart().

    Context.bindService()方法

             把这个Service和调用Service的客户类绑起来,如果调用这个客户类被销毁,Service也会被销毁,用这个方法的一个好处是,bindService()方法执行后,Service会回调onBind()方法,可以从这里返回一个实现了IBind接口的类,在客户端操作这个类就能和这个服务通信了,比如得到Service的运行状态或其他操作,如果Service还没有运行,使用这个方法启动Service就会调用onCreate()方法而不会调用onStart()方法。

    区别:

             StartService的调用者与服务没有联系,即使服务调用者退出了,服务仍然运行,而BindService的调用者与服务绑在一起,调用者一旦退出了服务也随即终止掉。

            BroadcastReceiver生命周期短,onReceiver方法必须在10秒内完成,因此将耗时通过Intent发送给Service,由Service进行处理(广播是Android应用组件间通信的重要手段)。举个栗子:可以在一个Service中注册一个BroadcastReceiver,在Activity中发送广播,从而实现Activity对Service的控制;也可以在一个Activity中注册一个BroadcastReceiver,在一个Service中发送广播来操作Activity中的UI。

    不知道起什么标题

            还是通过代码看吧好伐,就看在Activity中注册广播,在Service中发送广播,在Activity中接受广播的一系列过程:

    ① 在Activity中注册广播:

    ② 在Service中发送广播:(其实在Intent中是可以携带数据的)

    ③  在Activity的onReceive中接受广播:(如果Intent中有数据,就可以在这个地方对其进行接受)

    倒计时代码

    Activity中的代码:

    Service中的代码:

    相关文章

      网友评论

          本文标题:Android-Service与Broadcast以及倒计时

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