Android 服务(Service)

一、服务的解释

服务(Service)是Android中实现后台运行的解决方案,它适合那些去执行不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖任何的与任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。

注意:服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀死时,所有依赖于该进程的服务也会停止运行。

服务并不会自动开启线程,所有的代码都是默认运行在主线程中的。我们在服务的内部手动创建了子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。

二、Android多线程编程

1、线程的基本用法

这部分与Java相同,线程创建的两种方式。

2、在子线程中更新UI

与其他许多的GUI库一样,Android的UI也是不安全的。也就是说,如果想要更新应用程序的UI元素,则必须在主线程中进行,否则就会出现异常。

实践:新建AndroidThreadTest项目:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.zhj.androidthreadtest.MainActivity"><Buttonandroid:id="@+id/change_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Change Text"/><TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="Hello world"android:textSize="20sp"/>
</RelativeLayout>

一个按钮,一个TextView,显示出Hello world,目标效果:当我们点击按钮时,会把Hello world 改变成 Nice to meet you。

我们开始写MainActivity.java

package com.zhj.androidthreadtest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private TextView text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text =(TextView)findViewById(R.id.text);Button changeText = (Button)findViewById(R.id.change_text);changeText.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.change_text:new Thread(new Runnable() {@Overridepublic void run() {text.setText("Nice to meet you");}}).start();break;default:break;}}});}
}

逻辑非常简单。我们在 按钮的点击事件中开启了一个子线程,然后在子线程中调用TextView的setText()方法将显示的字符串改成Nice to meet you。我们运行之后,点击按钮按钮发现程序崩溃了。

查看logcat日志:可以看出由于在子线程中更新UI造成的。


由此证实,An'd'roid确实不允许在子线程中进行UI操作的。但是有些时候我们必须在子线程中去执行一些耗时任务,然后根据任务的执行结果来更新相应的UI控件。

对于这种情况,Android 提供了一套异步消息处理机制,完美解决了在子线程中进行UI操作的问题。我们先来了解一下异步消息处理的使用方法,

修改MainActivity的代码:

package com.zhj.androidthreadtest;import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {public static final int UPDATE_TEXT = 1; //表示更新TextView这个动作private TextView text;private Handler handler = new Handler(){//新增Handler对象,并重写handleMessage()方法,对具体的Message进行处理,public void handleMessage(Message msg){//如果发现Message的what字段的值等于UPDATA_TEXT,就将TextView显示的内容改成Nice to meet youswitch (msg.what){case UPDATE_TEXT ://在这里进行UI操作text.setText("Nice to meet you");break;default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text =(TextView)findViewById(R.id.text);Button changeText = (Button)findViewById(R.id.change_text);changeText.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.change_text:new Thread(new Runnable() {@Overridepublic void run() {Message message = new Message();//创建一个Message(android.os.Message)对象,并将他的what字段设置为UPDATE_TEXTmessage.what = UPDATE_TEXT;handler.sendMessage(message);//将Message对象发送出去}}).start();break;default:break;}}});}
}

来观察按钮的点击事件中的代码,我们并没有在子线程里直接进行UI操作,而是创建了一个Message(android.os.Message)对象,并将它的what字段指定为UPDATE_TEXT,然后调用Handler的sendMessage()方法将这条Message发送出去。Handler会收到这条Message,并在handlerMessage()方法中对它进行处理,注意此时的handlerMessage()方法中的代码就是在主线程中运行的了,所以我们放心在这里进行UI操作。

运行之后,我们会发现内容被替换成Nice to meet you 。

3、解析异步消息处理机制

Android中的异步消息处理主要分为4个部分:Message、Handler、MessageQueue和Looper。

    (1)Message:Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据,可以使用Message的what字段,还可以使用arg1和arg2字段来携带一些整型数据,使用obj字段携带一个Object对象。

    (2)Handler:处理者的意思,主要用于发送和处理消息的,发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列的辗转处理后,最终会传递到Handler的handleMessage()方法中。

    (3)MessageQueue:消息队列,主要用于存放所有通过Handler发送的消息。这部分消息会一直存放在消息队列中,等待被处理。每个线程中只有一个MessageQueue对象。

    (4)Looper:每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handlerMessage()方法中。每个线程中也只有要给Looper对象。

我们把异步消息处理的整个流程再梳理一遍。首先需要在主线程中创建一个Handler对象,并重写handlerMessage()方法,这个方法里写你的逻辑。当主线程中需要进行UI操作时,就创建一个Message对象,并通过Handler把这条消息发送出去。之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的handlerMessage()方法中。由于Handler是在主线程中创建的,所以此时handlerMessage()方法中的代码也会在主线程中运行,于是我们在这里可以进行UI操作了。


一条Message经过这样一个流程的辗转调用后,也就从子线程进入到了主线程,从不能更新UI变成了更新UI,整个异步消息处理的核心思想就是如下。

4、使用AsyncTask


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CenOS 配置C/C++语言

1.下载eclipseCDT组合包。 2.电脑上安装GCC&#xff0c; G 3.在eclipse上创建一个C project 4. Eclipse CDT功能很强大&#xff0c;安装完虽然可以编译运行c程序&#xff0c;但有个问题&#xff0c;就是找不到c标准库的头文件&#xff0c;无法打开诸如之类的文件&#xff0c;编…

(数据结构)前缀,后缀以及中缀表达式

中缀表达式&#xff08;中缀记法&#xff09; 中缀表达式是一种通用的算术或逻辑公式表示方法&#xff0c;操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。 前缀表达式&#xff08;前缀记法、波兰式&#xff09; 前缀表达式是一种没有括号的算术表…

Moravec角点检测算子

Moravec角点检测算子 Moravec 在1981年提出Moravec角点检测算子[1]&#xff0c;并将它应用于立体匹配。 首先, 计算每个像素点的兴趣值, 即以该像素点为中心, 取一个w*w(如:5x5)的方形窗口, 计算0度、45度、90度、135度四个方向灰度差的平方和, 取其中的最小值作为该像素点的兴…

java习题-练习1

1、 Given the string, check if it is a palindrome.&#xff08;回文&#xff09; Example For inputString "aabaa", the output should becheckPalindrome(inputString) true;For inputString "abac", the output should becheckPalindrome(inputSt…

文件夹生成工具

很简单的一个小工具,输入一个字符串,可以为你生成相应的文件夹. 至于有什么用?我公司一个策划拿一顿饭给我要的. 下载地址: http://pan.baidu.com/s/1d0ewl 转载于:https://www.cnblogs.com/WhyEngine/p/3350053.html

java中System.exit(1)、System.exit(0)、以及return的区别

System.exit(0)是正常退出程序&#xff0c;而System.exit(1)或者说非0表示非正常退出程序System.exit(status)不管status为何值都会退出程序。 和return 相比有以下不同点&#xff1a;return是回到上一层&#xff0c;而System.exit(status)是回到最上层

(转载)深入理解Linux中内存管理---分段与分页简介

首先&#xff0c;必须要阐述一下这篇文章的主题是Linux内存管理中的分段和分页技术。 来回顾一下历史&#xff0c;在早期的计算机中&#xff0c;程序是直接运行在物理内存上的。换句话说&#xff0c;就是程序在运行的过程中访问的都是物理地址。如果这个系统只运行一个程序&…

eclipse解决Android Library Project jar包重复导致的问题

Android Studio部分情况下用起来还是有些不适应的地方&#xff0c;用eclipse熟练了&#xff0c;在赶项目进度的情况下还得重拾eclipse。下面是今天碰到的一个老问题。 1.在导入Android Library工程文件的时候要把library一起拷贝到workspace中 2.在导入的Android Library工程文…

java中main函数的args参数

先说一下args的作用&#xff1a;我们习惯将一些有用的参数传递给我们定义的函数&#xff0c;那么可曾想过有参数传递给main函数&#xff1f;args就是传递给main函数的一个数组参数。可是main函数作为程序(application程序)的入口点&#xff0c;是由系统自动调用的&#xff0c;怎…

算法:排序算法的比较

默认为递增顺序&#xff1b;注&#xff1a;一下例子希望自己再次复习时&#xff0c;可以用笔在纸上画画内存图。 包括有: 选择排序冒泡排序插入排序 1.选择排序 <--------------------------------------选择排序---------------------------------------> 1、选择排…

LTTng 简介使用实战

一、LTTng简介 LTTng: (Linux Trace Toolkit Next Generation),它是用于跟踪 Linux 内核、应用程序以及库的系统软件包。LTTng 主要由内核模块和动态链接库(用于应用程序和动态链接库的跟踪)组成。它由一个会话守护进程控制,该守护进程接受来自命令行接口的命令。babeltrace 项…

黑马程序员-------------(十)Java基础知识加强(一)

JDK1.5新特性 目录1.之前已经学习过的JDK1.5新特性2.静态导入 StaticImport3.可变参数 ...4.高级for循环5.枚举6.泛型 Generic7.注解注&#xff1a;本章全部为重点内容。###################################################################################################…

java例子:数组 数3退1

500个人围成一个圈子&#xff0c;数够3人&#xff0c;就退出1个&#xff0c;问最后剩下的是几号&#xff1f;检验先有5个人&#xff0c;应该留下第4个人&#xff0c;由于是数组&#xff0c;所以第四个人的下标是3. /*achieve the funtion :count 3 kids, the quit the third k…

Android版CCLabelTTF在setstring时出现黑块

首先有个前提知识&#xff0c;cocos2dx里&#xff0c;只能在ui线程&#xff08;通常也就是主线程&#xff09;中进行渲染工作&#xff08;貌似现在有一些引擎是支持多线程渲染的&#xff0c;没有深入研究&#xff09;&#xff0c;否则大约会因为多个线程同时给GPU发指令而出现问…

java例子:九九乘法表

来吧直接上代码&#xff1a;public class Test{public static void main(String[] args) {for(int i 1; i<9;i){for (int j 1; j < i ;j ) {System.out.print(j"x"i""j*i" ");}System.out.print("\n");}} }运行之后&#xff1…

Apache的RewriteRule规则详细介绍

R[code](force redirect) 强制外部重定向 (rkyW z强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定&#xff0c;将用缺省的302 HTTP状态码。 gN24M 3{CF(force URL to be forbidden)禁用URL,返回403HTTP状态码。 m> 4ahue$G(force URL…

算法:查找

查找算法&#xff08;比较&#xff09;基本思想顺序查找顺序查找也称为线形查找&#xff0c;属于无序查找算法。从数据结构线形表的一端开始&#xff0c;顺序扫描&#xff0c;依次将扫描到的结点关键字与给定值k相比较&#xff0c;若相等则表示查找成功&#xff1b;若扫描结束仍…

query上传插件uploadify参数详细分析

query上传插件uploadify参数详细分析 Uploadify Version 3.2 官网&#xff1a;http://www.uploadify.com/ 注&#xff1a;文件包里有两个js分别是&#xff1a;jquery.uploadify.js 和 jquery.uploadify.min.js&#xff0c;两者其实一样&#xff0c;只需载入其中一个js即可。很明…

python 基础 list和 tuple dict和set

list Python内置的一种数据类型是列表&#xff1a;list。list是一种有序的集合&#xff0c;可以随时添加和删除其中的元素。classmates [Michael, Bob, Tracy] 要删除list末尾的元素&#xff0c;用pop()方法&#xff1a; 要删除指定位置的元素&#xff0c;用pop(i)方法&#x…

IIS的安装

xp上好像只能装IIS5&#xff0c;IIS6根本就装不了转载于:https://www.cnblogs.com/hyk110988/p/3372592.html