第十章、服务
服务:是Android中实现程序后台运行的解决方案,适合执行那些不需要和用户交互而且还有长期运行的任务。服务的运行不依赖任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。
服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。
线程
- 通过继承线程类
定义线程:定义一个继承自Thread的类,重写run()方法,并在里面编写耗时逻辑。
class MyThread extends Thread { @override public void run() { //处理具体的逻辑 } }
开启线程:new出MyThread的实例,调用它的start()方法
new Mythread().start()
- 使用继承的耦合性有点高,更多的时候我们选择实现Runnable接口的方式来定义一个线程
class MyThread implements Runnable { @override public void run() { //处理具体逻辑 } } //启动方法也相应改变 MyThread myThread = new MyThread(); new Thread(myThread).start();
Thread的构造函数接收一个Runnable参数,而我们new出的MyThread是实现了Runnable接口的对象。
- 使用匿名类(更常用)
new Thread(new Runnable) { @override public void run() { //处理具体逻辑 } }
主线程
当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread),因为它是程序开始时就执行的,如果你需要再创建线程,那么创建的线程就是这个主线程的子线程。每个进程至少都有一个主线程,在Winform中,应该就是创建GUI的线程。
Android中不允许在子线程中进行UI操作。
异步消息处理(解决上述问题)
Android中的异步消息处理主要有4个部分组成:Message、Handler、MessageQueue和Looper。
- Message
Message是在线程之间传递的消息。可在内部携带少量信息,用于在不同线程之间交换数据。使用Message的what字段携带自定义消息,使用arg1和arg2字段携带整型数据,使用obj字段携带一个Object对象。
- Handler
用于发送和处理消息。发送消息一般使用Handler的sendMessage()方法,发出的消息经过处理后最终会传递到Handler的handleMessage()方法中。
- MessageQueue
消息队列,主要用于存放所有通过Handler发送的消息。这部分消息一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。
- Looper
Looper是每个线程 中的MessageQueue的管家,调用Looper的loop()方法后,就会进入一个无限循环中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程中也只会有一个Looper对象。
使用AsyncTask (Async:异步)
AsyncTask是一个抽象类,所以要想使用需要创建一个类去继承它。在继承时可以为AsyncTask类指定3个泛型参数。
- Params:在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。
- Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里制定的泛型作为进度单位。
- Result:任务执行完毕后,若需返回结果,则使用这里指定的泛型作为返回值类型。
例:class DownloadTask extends AsyncTask