您的位置:首页 > 移动开发 > Android开发

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

2017-08-03 09:35 513 查看
原创作品,转载请注明出处^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栈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android