Android探究服务(初学)

Service是Android中实现程序后台运行的解决方案。

它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。

服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另一个程序,服务仍然能保持正常运行。

PS:服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。

当这个应用程序进程被杀掉时,所有依赖该进程的服务都会停止运行。

我们需要做什么:在服务的内部创建子线程,并在这里执行具体的任务。

2.1线程的基本用法

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        1.最基本的线程继承启动
        new MyThread().start();


//        2.实现Runnable接口启动
        My2Thread my2Thread = new My2Thread();
        new Thread(my2Thread).start();


//        3.匿名类直接启动,最常用
        new Thread(new Runnable() {
            @Override
            public void run() {

            }
        });

    }

//    1.最基本的线程继承Thread,高耦合
    class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
        }
    }

//    2.实现Runnable接口
    class My2Thread implements Runnable{
        @Override
        public void run() {

        }

    }

2.2在子线程中更新UI

和许多其他的GUI库一样,Android的UI也是线程不安全的。

也就是说:想要更新程序的UI,必须在主线程中进行,否则会报错。

但是有些时候我们必须在子线程里去执行一些耗时操作,然后根据操作的结果来更新UI,这个时候就需要用到异步消息处理机制。

2.3解析异步消息处理机制

Android中的异步消息处理主要由4个部分组成:Message Handler MessageQueue 和 Looper 

  1. Message
    Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。
  2. Handler
    Handler顾名思义也就是处理着的意思,它主要是用于发送和处理消息的。发送消息一般是使用Handler的sendMessage()方法,而发送的消息经过一系列地辗转处理后,最终会传递到Handler的handlerMessage()方法中。
  3. MessageQueue
    MessageQueue是消息列队的意思,它主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息列队中,等待被处理。每一个线程中只会有一个MessageQueue对象。
  4. Looper
    Looper是每个线程中的MessageQueue管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handlerMessage()方法中。每个线程也只会有一个Looper对象。

异步消息处理的完整流程:

首先需要在主线程当中创建一个Handler对象,并重写handlerMessage()方法。

然后当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。

之后这条消息会被添加到MessageQueue的队列中等待被处理。

而Looper则会一直尝试从MessageQueue中取出待处理的消息。

最后分发会Handler的handlerMessage()方法中。

由于Handler实在主线程里创建的,所以此时handleMessage()方法中的代码也会在主线程中运行。

流程图:



















猜你喜欢

转载自blog.csdn.net/qq_38376757/article/details/80218784