Android Service(服务)详解·(一)相关知识点引入

来源:互联网 发布:php {{asset}} 编辑:程序博客网 时间:2024/06/04 21:54

原创作品,转载请注明出处^O^
Service是Android四大组件之一,它主要是去执行耗时操作(不需要与用户交互并且要长期运行的任务)。

Service不依赖于用户界面,但依赖于创建服务的应用进程,同时也不会自动开启线程,所以我们需要在服务内部手动创建线程,否则就可能会出现线程阻塞。


在具体讲解Service之前,我们先引入几个关于Android多线程的知识点:

1.Android多线程基本用法

多线程的作用就是避免在主线程做耗时操作而导致线程阻塞,从而影响用户体验。

1.继承Thread,重写run方法

public class MyThread extends Thread {    @Override    public void run() {        //具体实现代码    }}调用   new MyThread().start();

2.实现Runnable接口

public class MyThread implements Runnable {    @Override    public void run() {        //具体实现代码    }}调用  MyThread myThread = new MyThread();     new Thread(myThread).start();

3.匿名类方式

new Thread(new Runnable() {            @Override            public void run() {                //具体实体            }        }).start();

4.切记不可在主线程更新UI


2.异步消息处理

Android中的异步消息处理主要有4部分:

1.Message

Message是在线程之间传递的消息,它可以在内部携带少量信息,用于在不同线程之间交换数据。

2.Handler

Handler主要用于发送和处理消息。

3.MessageQueue

MessageQueue是消息队列的意思,主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待处理。

4.Looper

Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环中,每当MessageQueue中存在一条消息,就将它取出,传递到Handler的handleMessage()方法中。

整个流程如图所示(请忽略我清新脱俗的配图)



3.AsyncTask

AsyncTask的实现原理也是基于异步消息处理机制

由于AsyncTask是一个抽象类,所以必须创建一个子类继承它。在继承时可以为AsyncTask类指定3个泛型参数:

  • Params 在执行AsyncTask时需要传入的参数,可用于后台任务。
  • Progress 后台任务执行时,可以使用这里指定的泛型作为进度单位
  • Result 任务执行完成时,可以使用这里指定的泛型作为返回值类型
public class MyTask extends AsyncTask<Void,Integer,Boolean>{    }

现在创建完MyTask如果要使用还需要重写里面的方法,常用的有以下4个:

1.onPreExecute()

后台任务执行前调用,用于界面上的一些初始化操作。

2.doInBackground(Params...)

代码执行在子线程,处理耗时操作。返回类型根据AsyncTask类的第三个泛型参数决定(上文中提到的Result)。
不可进行UI操作,可通过publishProgress() 从而调用下一个方法onProgressUpdate()操作UI

3.onProgressUpdate(Progress...)

在这个方法中对UI进行操作

4.onPostExecute(Result)

后台任务执行完成时调用此方法

  • 重写方法后变成这样
public class MyTask extends AsyncTask<Void,Integer,Boolean>{    @Override    protected void onPreExecute() {        //显示对话框等UI操作    }    @Override    protected Boolean doInBackground(Void... voids) {        //执行后台任务        //不可操作UI        publishProgress(integer);//通过此方法调用onProgressUpdate        return ture;    }    @Override    protected void onProgressUpdate(Integer... values) {        //获取后台执行进度        //可操作UI    }    @Override    protected void onPostExecute(Boolean aBoolean) {        //后台任务执行完成        //可操作UI    }}

启动AsyncTask,只需要简单的一句

new MyAsyncTask().execute();

本篇文章就到这里,内容只是引入了多线程,异步消息处理,AsyncTask的概念和简单使用。
下篇文章会正式介绍Service的使用,并附Demo。
Service做为四大组件之一,很值得深入,所以本系列也会由浅入深,从会使用到最终了解其实现原理。

相关文章
Android Service(服务)详解·(二)Service基本用法

每星期至少一篇跟新本系列,感兴趣可以关注。
一起学习,一起进步。

个人公众号 Coder栈
个人公众号 Coder栈