版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章 服务9.1 Android多线程编程9.5 实战演练9.3 服务的生命周期9.2 服务的基本用法9.4 更多服务使用技巧9.6 小结9.1 Android多线程编程Service(服务)是一个长期运行在后台的用户组件,没有用户界面,是Android中实现程序后台运行的解决方案,非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程,且服务不会自动开启线程,所有代码都是默认运行在主线程中,因此我们需
2、要在服务内部手动创建子线程,并在子线程内部执行具体任务,以防止主线程被阻塞。接下来我们学习一下Android多线程的知识。9.1.1 线程的基本用法Android中的多线程和Java中多线程的用法基本类似定义一个线程的时候只需要新建一个继承自Thread的类,并且重写父类的run()方法,在该方法中编写耗时操作逻辑即可,示例如下:通过创建MyThread的实例,然后让这个实例调用start()方法,这样run()方法中的代码就可以在子线程中运行,示例如右图所示:class MyThread extends ThreadOverride public void run() /具体处理逻辑9.1
3、Android多线程编程new MyThread().start();在实际应用中为了避免继承中的高耦合性,一般会选择使用实现Runnable接口的方法定义线程,示例如下:相应的,这样定义线程的方式使启动线程的方式也发生改变,示例如下:class MyThread implements RunnableOverridepublic void run()/具体处理逻辑9.1 Android多线程编程MyThread myThread = new MyThread();new Thread(myThread).start();如果在编码中我们不想专门定义一个类去实现Runnable接口,也可以选择
4、使用匿名类的方式编写,示例如下:new Thread(new Runnable()Overridepublic void run()/具体逻辑处理).start();9.1 Android多线程编程9.1.2 更新UIAndroid系统的UI是线程不安全的,也就是说,如果想要更新应用程序里的UI元素,必须在主线程中进行,否则程序会出现异常崩溃。Android为了解决这个问题提供了一套异步消息处理机制,完美的解决了在子线程中进行UI操作的问题。通过教材案例 P217演示Android异步消息处理机制。9.1 Android多线程编程9.1.3 Handler消息机制Android中异步消息处理机
5、制也就是Handler消息处理机制。主要由4各部分组成:Message、Handler、MessageQueue和Looper。处理过程:在主线程中绑定Handler对象,并在事件触发上面创建子线程用于完成耗时操作,当子线程中的工作完成后,会向Handler对象发送一个已完成的信号(Message对象),主线程中的Handler收到信号后,会进行主线程UI更新。9.1 Android多线程编程组成部分介绍:Message-在线程之间传递的消息,它可以通过在内部携带少量信息在不同线程之间交换数据。Message的what字段可以用来携带整型数据,obj字段可以用来携带Object对象。Handl
6、er-是处理者的意思,主要用于发送消息和处理消息。一般使用Handler对象的sendMessage()方法发送消息,发送的消息经过一系列处理后,最终会传递到Handler对象的handleMessage()中。9.1 Android多线程编程MessageQueue-消息队列的意思,主要用来存放通过Handler发送的消息。通过Handler发送的消息会存在MessageQueue中等待处理,每个线程只有一个MessageQueue对象。Looper-是线程中MessageQueue的管家,调用Looper的loop()方法后,就会进入到无限循环,每当发现MessageQueue中存在信息就
7、会取出并传递到Handler的handleMeesage()方法中。9.1.4 实战演练打开网络图片23功能描述:技术要点:用户交互界面的设计与实现界面逻辑代码的设计与实现添加访问网络权限案例代码(详见教材P220P224)实现步骤: 通过网络浏览器打开服务器端图片并刷新界面使用HttpHRLConnection的get请求获取网络图片运用Handler机制刷新主线程19.1 Android多线程编程9.1.5 异步任务AsyncTask的使用实际开发中,为了更加方便我们在子线程中对UI进行操作,Android还提供了一个必学的好用工具AsyncTask,它是Android给我们提供的一个处理
8、异步任务的类。可以实现UI线程和后台线程的通讯,后台线程执行异步任务,并把结果返回给UI线程。9.1 Android多线程编程为什么需要使用异步任务保证了UI的稳定性以及准确性,同时避免多个线程同时对UI进行操作造成UI混乱;Google规定Android 4.0以后访问网络操作这样的耗时操作必须放在子线程中,以免造成任务阻塞抛出Application Not Responsed(ANR)错误。AsyncTask为何而生Android给我们提供了一个封装好的组件AsyncTask,可以方便的实现异步任务处理,同时也可以在子线程中更新UI,并且封装简化了异步操作;AsyncTask封装了使用线程
9、以及线程池处理异步任务涉及到线程同步以及管理问题的过程,使我们方便的在子线程中更新UI。9.1 Android多线程编程构建AsyncTask子类的泛型参数AsyncTask是一个抽象类,所以我们想使用它必须创建一个子类去继承它。在继承的同时我们可以为AsyncTask指定3个泛型参数,这3各参数的用途如下:Params:启动任务时输入的参数类型。Progress:后台任务执行中返回的进度值的类型。Result:后台任务执行完成后返回记过的类型。9.1 Android多线程编程构建AsyncTask子类的回调方法AsyncTask中主要有以下几个方法:doInBackground(Param)
10、 onPreExecute():onPostExecute(Result):onProgressUpdate(Progress)参考案例见书本P225-228页9.1 Android多线程编程服务(Service)是Android四大组件之一,服务也有很多重要的知识点,接下来我们从最基本的开始学习。9.2 服务的基本用法9.2.1 服务的创建服务的创建方式与广播接收者类似,只需要在项目的程序包名上单击右键,选择性【new】【Service】【Service】选项,接着在弹出窗口,图9-6所示,中输入服务的名称即可。9.2 服务的基本用法Exported属性表示是否允许当前程序之外的其他程序访问
11、这个服务,Enabled属性表示是否启用这个服务,我们将这两个选项都勾选,点击Finish完成创建9.2.2 服务的启动与停止创建好服务后,接下来我们来学习服务的启动以及停止的方法,在代码中主要依靠Intent来实现。首先在onCreate()方法中获取按钮实例并注册点击事件,然后在点击事件中构建Intent对象,并调用startService()方法来启动服务,调用stopService()方法来停止服务,因为这两个方法是定义在Context中的因此我们可以直接调用。注意,这种启动方式完全由活动来决定服务何时停止,如果不点击STOP SERVICE按钮停止服务,服务会一直处于运行状态。9.2
12、 服务的基本用法9.2.3 服务的通信Android中允许活动Activity与服务之间进行通信,借助创建服务时默认生成的onBind()方法就可以实现。任何一个服务在整个应用程序范围内都是通用的,也就是说服务不仅可以和活动进行绑定,也可以和任何一个其他活动进行绑定。示例代码参考P233-2369.2 服务的基本用法服务的启动方式分为两种,分别是startService()方法和bindService()方法。服务根据启动方式的不同,也有其自己不同的生命周期。9.3 服务的生命周期onCreate():第一次创建服务是执行的方法;onDestroy():服务被销毁时执行的方法;onStartC
13、ommand():客户端通过调用startService()方法启动服务时执行该方法;onBind():客户端通过调用bindService()方法启动服务时执行的方法;onUnbind():客户端调用unBindService()方法断开服务器绑定时执行的方法。9.4.1 使用前台服务前台服务的特点是会一直有一个正在运行的图标在系统栏显示,下拉状态栏后可以看到更加详细的信息,类似于通知的效果。Android 8.0及以上系统为了提高电池续航时间而引入了一系列后台执行限制及变更,其中就包括前台服务以及通知的变更。Android 9.0或更高版本在使用前台服务时必须请求 FOREGROUND_S
14、ERVICE 权限,否则运行程序则系统会引发 SecurityException错误9.4 更多服务使用技巧9.4.2 IntentService的使用 在开发安卓应用的过程中,我们经常需要这样的场景:希望APP在不影响当前用户的操作的前提下,在后台默默的做一些任务。为了可以简单的创建一个异步的、会自动停止的服务,Android专门提供了一个IntentService类,这个类会在任务执行完成后自行结束而不需要外部调用stopSelf()方法了,这样就很好的解决了前面提到的两种尴尬。Android Studio提供的快捷方式也支持创建IntentService,大家可以尝试,此处我们使用手动方式创建。9.5 更多服务使用技巧9.5 实战演练下载23功能描述:技术要点:添加依赖使用OkHttp协议进行网络请求使用异步任务AsyncTask进行下载并刷新界面解析下载
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物标志物在药物临床试验中的生物标志物研究进展
- 生物反馈技术的BCI教学应用
- 酒店集团客房部经理的面试问题集
- 市场策划岗位求职面谈题目
- 副总经理招聘考试题
- 球囊扩张在TAVR中的关键作用
- 龙湖集团工程部专员技能考核题库含答案
- 市场营销专员岗位面试宝典及答案
- 初级会计师备考技巧及常见考点分析
- 茶叶加工机械项目可行性研究报告(立项备案申请)
- 2025浙江金华市义乌市机关事业单位编外聘用人员招聘(20250401)备考笔试试题及答案解析
- 幼儿园冬至主题活动课件
- 火锅店铺运营方案
- 《JBT 6402-2018 大型低合金钢铸件 技术条件》(2026年)实施指南
- 2025年阿克苏辅警招聘考试真题附答案详解(综合卷)
- 山东省烟台市招远市(五四学制)2024-2025学年八年级上学期语文期末考试试卷(含答案)
- 雨课堂学堂在线学堂云《爱上国乐(东华理大 )》单元测试考核答案
- 丁酮安全操作规程与注意事项
- 家庭电路的基本组成课件 2025~2026学年人教版九年级物理全一册
- 荒诞医学史课件
- 养老院旅居合同范本
评论
0/150
提交评论