Android服务(Service)
服务是一个后台的组件,执行长时间运行且不需要用户交互的任务。即使应用被销毁也依然可以工作。服务基本包含两种状态
![](https://i-blog.csdnimg.cn/blog_migrate/f5757cfcb883eee89c06ee67cc57dd09.png)
服务拥有生命周期方法,可以实现监控服务状态变化,可以在合适的阶段执行工作,下面左图展示了当服务通过startService()被创建时的生命周期,右图则显示当服务通过binService()被创建时的生命周期:
![](https://i-blog.csdnimg.cn/blog_migrate/7437dc80887e0ce1b0593c7e3cbd0ba0.png)
要创建服务,需要创建一个继承自Service基类或者它的已知子类的java类。Service基类定义了不同的回掉方法和多数重要方法。不需要实现所有的回调方法。
![](https://i-blog.csdnimg.cn/blog_migrate/2efa6108183d28d6e3118995595746e9.png)
下面的主服务演示了每个方法的生命周期:
![](https://i-blog.csdnimg.cn/blog_migrate/6eb0703add3657f7bdf9d0d71bb39448.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6a51bc78d5ebb0bb1d78ece7fb8cdf4c.png)
实例 通过简单的步骤战士如何创建自己的Android服务。按照下面的步骤来修改之前HelloWorld实例章节中创建的Android的应用程序。
![](https://i-blog.csdnimg.cn/blog_migrate/3f7a4a738ba8d035d2291319c687cfff.png)
下面是活动文件src/cn.uprogrammer.androidservices/MainActivity.java文件所修改的内容。这个文件包含所有基本的生命周期方法。添加量startSercice()和stopService()方法来启动和停止服务。
![](https://i-blog.csdnimg.cn/blog_migrate/02d2ff548751c80399dcdd29be717857.png)
以下是src/cn.uprogrammer.androidservices/MyService.java的内容。这个文件可以给予需求实现一个或多个服务关联的方法。我们只实现onStartCommand()和onDestroy()
![](https://i-blog.csdnimg.cn/blog_migrate/ff449415c88bd26fcb34cf77ec19e3da.png)
下面修改AndroidManifest.xml文件。这里添加<service..../>标签来包含我们的服务:
![](https://i-blog.csdnimg.cn/blog_migrate/22f72c465b0c620ae0138979fb83e8fc.png)
以下是res/layout/activity_main.xml文件的内容,包含两个按钮:
![](https://i-blog.csdnimg.cn/blog_migrate/d80f7cc8ff6b3d132113bc96ce5b5b75.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5d06937e575d8fc544197ee109f53a10.png)
下面是res/values/strings.xml的内容,来定义两个新的常量:
![](https://i-blog.csdnimg.cn/blog_migrate/3d08b3a6569abbba76dd50c9e66828f7.png)
Android广播接收器(Broadcast Receivers)
广播接收器用于响应来自其他应用程序或者系统的广播消息。这些消息有时被称为事件或者意图。例如,应用程序可以初始化广播来让其他的应用程序知道一些数据已经被下载到设备,并可以为他们所用。这样广播接收器可以定义适当的动作来拦截这些通信。
有以下两个重要的步骤来使系统的广播意图配合广播接收器工作。创建广播接收器 注册广播接收器
还有一个附加的步骤,要实现自定义的意图,你必须创建并广播这些意图。
创建广播接收器
广播接收器需要实现为BroadcastReceiver类的子类,并重写onReceive()方法来接收以Intent对象为参数的消息。
![](https://i-blog.csdnimg.cn/blog_migrate/5a355fca87347aff55d07fac2f66644d.png)
注册广播接收器
应用程序通过在AndroidManifest.xml中注册广播接受我i来监听指定的广播意图。假设我们将要注册MyReceiver来监听系统产生的ACTION_BOOT_COMPLETED事件。该事件由Android系统的启动进程完成时发出。
![](https://i-blog.csdnimg.cn/blog_migrate/da016525b3b07a341cf3242d19c78151.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fac4c54e6c5ae9a1b38788a49937da10.png)
无论什么时候Android设备被启动,都将被广播接收器MyReceiver所拦截,并且在onReceive()中实现的逻辑将被执行。有许多系统产生的事件被定义为类Intent中的静态常量值。下面表格列举了重要的系统事件。
![](https://i-blog.csdnimg.cn/blog_migrate/e9762410537d04b69867159d4a3b6e5a.png)
广播自定义图
要想发送自定义图,需要在活动类中通过sendBroadcast()来创建发送这些意图。若使用sendStickyBroatcast(intent)方法,邪恶意图是持久的(sticky),这意味着发出的意图在广播完成后一直保持着。
![](https://i-blog.csdnimg.cn/blog_migrate/ef32e4fb4c2a3da04c544a0cd8473eee.png)
cn.uprogrammer.CUSTOM_INTENT的意图可以像之前我们注册系统产生的意图一样被注册。
![](https://i-blog.csdnimg.cn/blog_migrate/a30735671ee092b30426e74ceb3e6f0d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/78ccca790748407d133250780d1f72d9.png)
下面是修改的主要活动文件src/cn.uprogrammer.broadcastreceiver/MainActivity.java的内容。这个文件包含了每个基础的生命周期方法。我们添加了broadcastIntent()方法来广播自定义事件。
![](https://i-blog.csdnimg.cn/blog_migrate/d49c495784028cf7aaf0f93b3a6397df.png)
下面是src/cn.uprogrammer.broadcastreceiver/MyReceiver.java的内容:
![](https://i-blog.csdnimg.cn/blog_migrate/6deb7d3b2a802101c8333ee4ee8902d5.png)
接下来修改AndroidManifest.xml文件。这里通过添加<receiver.../>标签来包含我们的广播接收器:
![](https://i-blog.csdnimg.cn/blog_migrate/994026319bb045c29da2f37afb4874cd.png)
下面是res/layout/activity_main.xml文件的内容,包含广播自定义意图的按钮。
![](https://i-blog.csdnimg.cn/blog_migrate/4ce3e6bce58b7f49bf0f98725987ff41.png)
下面是res/values/strings.xml文件的内容,定义了两个新的常量。
![](https://i-blog.csdnimg.cn/blog_migrate/9be61a986e42c6f7694c465c8017ace0.png)
进行运行广播实例。