Android四大组件之一。
服务(Service)是Android实现程序后台运行的解决方案,适合执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个程序,服务仍然能够正常运行。
需要注意:服务并不是运行在一个独立的进程中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀掉时,所有依赖于该进程的服务也会停止进行。
Android多线程编程:
Android和Java创建和启动线程使用方式相同。线程的基本用法:定义一个线程然后继承自Thread,重写父类的run()方法,并在里面编写耗时逻辑即可,然后new 一个实例,调用start()方法即可。或者实现Runnable接口然后new Thread(实例).start()即可。或者可以使用匿名类。
Android多线程编程和Java多线程编程不同的地方:Android不允许在子线程中更新UI操作,可以用异步消息处理机制解决在子线程中进行UI操作的问题。
解析异步消息处理机制:
了解这些基本概念之后,整理一下异步消息处理的流程:首先需要在主线程当中创建一个Handler对象,并重写handleMessage()方法。然后当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的handleMessage()方法中。由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行UI操作了。整个异步消息处理机制的流程示意图如下:
一条Message经过这样一个流程的辗转调用后,也将从子线程进入到了主线程,从不能更新UI变成了更新UI,整个异步消息处理的核心思想也就是如此。
使用AsyncTask:基于异步消息处理机制的,是一个抽象类。若想使用,必须创建一个子类去继承它。继承时可以为其指定3个泛型参数。
服务的基本用法:
1.定义一个服务:New->Service。继承自Service类,实现唯一的一个抽象方法onBind()。重写其他常用的方法:onCreate()、onStartCommand()和onDestroy()。
2.启动和停止服务:借助Intent来实现。
3.活动和服务进行通信:
4.服务的更多技巧:为防止内存不足回收掉后台运行的服务,可以考虑使用前台服务。前台服务和普通服务最大的区别在于,它会一直有一个正在运行的图标在系统的的状态栏展示,下拉状态栏后可以看到详细的信息,非常类似于通知的效果。服务的代码都是默认运行在主线程当中,如果直接在服务里去处理一些耗时的逻辑,就容易出现ANR(应用无响应)。这时候就需要用到Android多线程编程的技术了。应该在服务的每个具体的方法里开启一个子线程,然后在这里去处理那些耗时的逻辑。为了简单地创建一个异步的、自动停止的服务,Android专门提供了一个IntentService类。