书签 分享 收藏 举报 版权申诉 / 142
上传文档赚钱

类型第7章后台服务学习培训模板课件.ppt

  • 上传人(卖家):林田
  • 文档编号:4163046
  • 上传时间:2022-11-16
  • 格式:PPT
  • 页数:142
  • 大小:2.21MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《第7章后台服务学习培训模板课件.ppt》由用户(林田)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    后台 服务 学习 培训 模板 课件
    资源描述:

    1、第第7章章 后台服务后台服务本章学习目标:本章学习目标:n了解了解Service的原理和用途的原理和用途n掌握本地服务的管理方法掌握本地服务的管理方法n掌握服务的隐式启动和显式启动方法掌握服务的隐式启动和显式启动方法n了解线程的启动、挂起和停止方法了解线程的启动、挂起和停止方法n了解跨线程的界面更新方法了解跨线程的界面更新方法n掌握远程服务的绑定和调用方法掌握远程服务的绑定和调用方法n了解了解AIDL语言的用途和语法语言的用途和语法 7.1 Service简介简介 nServiceqAndroid系统的服务组件,适用于开发没有用系统的服务组件,适用于开发没有用户界面且长时间在后台运行的应用功能

    2、户界面且长时间在后台运行的应用功能q因为手机硬件性能和屏幕尺寸的限制因为手机硬件性能和屏幕尺寸的限制nAndroid系统仅允许一个应用程序处于激活状态并显系统仅允许一个应用程序处于激活状态并显示在手机屏幕上示在手机屏幕上n而暂停其他处于未激活状态的程序而暂停其他处于未激活状态的程序7.1 Service简介简介 nServiceqAndroid系统需要一种后台服务机制系统需要一种后台服务机制n允许在没有用户界面的情况下,使程序能够长时间允许在没有用户界面的情况下,使程序能够长时间在后台运行,实现应用程序的后台服务功能在后台运行,实现应用程序的后台服务功能n能够处理事件或数据更新能够处理事件或数

    3、据更新qAndroid系统提供的系统提供的Service(服务)组件,不(服务)组件,不直接与用户进行交互,能够长期在后台运行直接与用户进行交互,能够长期在后台运行q如如MP3播放器例子播放器例子7.1 Service简介简介 nService特点特点 q适用于无需用户干预,且有规则或长期运行的后台功能适用于无需用户干预,且有规则或长期运行的后台功能q没有用户界面,有利于降低系统资源的消耗没有用户界面,有利于降低系统资源的消耗q比比Activity的优先级高,不会被的优先级高,不会被Android系统优先终止系统优先终止q即使被系统终止,在系统资源恢复后将自动恢复运行状态即使被系统终止,在系统

    4、资源恢复后将自动恢复运行状态q可以认为是在系统中永久运行的组件可以认为是在系统中永久运行的组件q用于进程间通信(用于进程间通信(Inter Process Communication,IPC),解决不同),解决不同Android应用程序进程之间的调用和通应用程序进程之间的调用和通讯问题讯问题 7.1 Service简介简介 nService生命周期生命周期q完全生命周期:从完全生命周期:从onCreate()开始到开始到onDestroy()结束结束q活动生命周期:从活动生命周期:从onStart()开始,可以粗略的认为开始,可以粗略的认为以以onDestroy()标志结束标志结束7.1 Se

    5、rvice简介简介 nService生命周期生命周期qonCreate()事件回调函数:事件回调函数:Service的生命周期开的生命周期开始,完成始,完成Service的初始化工作的初始化工作qonStart()事件回调函数:活动生命周期开始,但没事件回调函数:活动生命周期开始,但没有与之对应的有与之对应的“停止停止”函数函数qonDestroy()事件回调函数:事件回调函数:Service的生命周期的生命周期结束,释放结束,释放Service所有占用的资源所有占用的资源7.1 Service简介简介 nService的使用方式的使用方式启动方式启动方式绑定方式绑定方式获取到获取到Servi

    6、ce的的对象实例对象实例否否是是调用调用Service中的中的函数函数否否是是获取到获取到Service中中的状态和数据信息的状态和数据信息否否是是使用特点使用特点具备自管理的能力;具备自管理的能力;不需要通过函数调不需要通过函数调用获取用获取Service的功的功能和数据能和数据通过服务链接通过服务链接(Connection)实现;)实现;会自动启动会自动启动Service;可可以绑定多个服务链接以绑定多个服务链接7.1 Service简介简介 n启动方式启动方式q启动启动Servicen调用调用Context.startService()n一定是由其它的组件启动一定是由其它的组件启动q停止

    7、停止Servicen其它组件:调用其它组件:调用Context.stopService()n自身完成:调用自身完成:调用Service.stopSelf()7.1 Service简介简介 n绑定方式绑定方式q建立服务链接建立服务链接n通过通过Context.bindService()q停止服务链接停止服务链接n通过通过Context.unbindService()7.1 Service简介简介 n启动方式和绑定方式的结合启动方式和绑定方式的结合q在某些情况下可以混合使用这两种方法在某些情况下可以混合使用这两种方法n以以MP3播放器为例播放器为例n在后台的工作的在后台的工作的Service通过通

    8、过Context.startService()启动某个音乐播放启动某个音乐播放n在播放过程中如果用户需要暂停音乐播放,则需要在播放过程中如果用户需要暂停音乐播放,则需要通过通过Context.bindService()获取服务链接和获取服务链接和Service对象实例对象实例n通过调用通过调用Service对象实例中的函数,暂停音乐播放对象实例中的函数,暂停音乐播放过程,并保存相关信息过程,并保存相关信息 n调用调用Context.stopService()并不能够停止并不能够停止Servicen要在所有的服务链接关闭后,要在所有的服务链接关闭后,Service才能够真正的才能够真正的停止停止

    9、 7.2 本地服务本地服务n调用者和服务都在同一个程序中调用者和服务都在同一个程序中n不需要跨进程就可以实现服务的调用不需要跨进程就可以实现服务的调用n涉及服务的涉及服务的q建立建立q启动启动q停止停止q绑定绑定q取消绑定取消绑定q在线程中实现服务在线程中实现服务7.2 本地服务本地服务n7.2.1 服务管理服务管理q服务的启动和停止服务的启动和停止q首先说明实现首先说明实现Service的最小代码集的最小代码集1 import android.app.Service;2 import android.content.Intent;3 import android.os.IBinder;4 5

    10、 public class RandomService extends Service6 Override7 public IBinder onBind(Intent intent)8 return null;9 10 7.2 本地服务本地服务n7.2.1 服务管理服务管理q第第1行到第行到第3行引入必要包行引入必要包q第第5行声明了行声明了RandomService继承了继承了android.app.Service类类q在第在第7行到第行到第9行重载了行重载了onBind()函数函数qonBind()函数是在函数是在Service被绑定后调用的函数,被绑定后调用的函数,能够返回能够返回Ser

    11、vice的对象实例的对象实例q这个这个Service最小代码集并没有任何实际的功能最小代码集并没有任何实际的功能7.2 本地服务本地服务n7.2.1 服务管理服务管理q为了使为了使Service具有实际意义,需要重载具有实际意义,需要重载onCreate()、onStart()和和onDestroy()n创建创建Service时,系统会自动调用时,系统会自动调用onCreate(),完成必要,完成必要的初始化工作,例如创建线程、建立数据库链接等的初始化工作,例如创建线程、建立数据库链接等n在在Service关闭前,系统会自动调用关闭前,系统会自动调用onDestroy()函数释函数释放所有占用

    12、的资源放所有占用的资源n通过通过Context.startService(Intent)启动启动Service,onStart()则会被调用,重要的参数通过参数则会被调用,重要的参数通过参数Intent传递给传递给Serviceq可以根据实际情况选择可以根据实际情况选择Service需要重载的函数需要重载的函数 7.2 本地服务本地服务n7.2.1 服务管理服务管理q第第4行、第行、第8行和第行和第12行代码重载行代码重载onCreate()、onStart()和和onDestroy()三个函数时,务必要在代码中调用父函数三个函数时,务必要在代码中调用父函数1 public class Ran

    13、domService extends Service2 Override3 public void onCreate()4 super.onCreate();5 6 Override7 public void onStart(Intent intent,int startId)8 super.onStart(intent,startId);9 10 Override11 public void onDestroy()12 super.onDestroy();13 14 7.2 本地服务本地服务n7.2.1 服务管理服务管理q注册注册Servicen如果不对如果不对Service进行注册,进行注

    14、册,Service根本无法启动根本无法启动nAndroidManifest.xml文件中注册文件中注册Service的代码如下的代码如下n使用使用标签声明服务,其中的标签声明服务,其中的android:name表示表示Service类的名称,一定要与建立的类的名称,一定要与建立的Service类名类名称一致称一致1 7.2 本地服务本地服务n7.2.1 服务管理服务管理q启动启动Servicen启动方式启动方式q显式启动显式启动q隐式启动隐式启动n显式启动:在显式启动:在Intent中指明中指明Service所在的类,并调用所在的类,并调用startService(Intent)启动启动Ser

    15、vice,示例代码如下,示例代码如下qIntent指明了启动的指明了启动的Service所在类为所在类为RandomSerevice1 final Intent serviceIntent=new Intent(this,RandomService.class);2 startService(serviceIntent);7.2 本地服务本地服务n7.2.1 服务管理服务管理q启动启动Servicen隐式启动:在注册隐式启动:在注册Service时,声明时,声明Intent-filter的的action属性属性 q设置设置Intent的的action属性,可以在不声明属性,可以在不声明Serv

    16、ice所在类所在类的情况下启动服务的情况下启动服务n隐式启动的代码如下隐式启动的代码如下1 2 3 4 5 1 final Intent serviceIntent=new Intent();2 serviceIntent.setAction(edu.hrbeu.RandomService);7.2 本地服务本地服务n7.2.1 服务管理服务管理q启动启动Service显式启动显式启动隐式启动隐式启动Service和调用服和调用服务的组件在同一务的组件在同一个应用程序中个应用程序中服务和调用服务服务和调用服务的组件在不同的的组件在不同的应用程序中应用程序中7.2 本地服务本地服务n7.2.1

    17、服务管理服务管理q停止停止Servicen将启动将启动Service的的Intent传递给传递给stopService(Intent)函数即可,示例代码如下函数即可,示例代码如下1 stopService(serviceIntent);7.2 本地服务本地服务n7.2.1 服务管理服务管理q无论调用过多少次无论调用过多少次startService(Intent),在调用,在调用stopService(Intent)函数时,系统仅调用一次函数时,系统仅调用一次onDestroy()onCreate()onStart()onDestroy()首次调用首次调用startService(Intent)

    18、第二次调用第二次调用startService(Intent)调用调用stopService(Intent)7.2 本地服务本地服务n7.2.1 服务管理服务管理qSimpleRandomServiceDemo是在应用程序中使是在应用程序中使用用Service的示例的示例q这个示例使用显式启动的这个示例使用显式启动的方式启动方式启动Serviceq在工程中创建了在工程中创建了RandomService服务,服务,该服务启动后会产生一个该服务启动后会产生一个随机数,并使用随机数,并使用Toast显显示在屏幕上,如右图所示示在屏幕上,如右图所示 7.2 本地服务本地服务n7.2.1 服务管理服务管理

    19、q示例示例n通过界面上的通过界面上的“启动启动Service”按钮调用按钮调用startService(Intent)函数,启动函数,启动RandomService服务服务 n“停止停止Service”按钮调用按钮调用stopService(Intent)函数,函数,停止停止RandomService服务服务n为了能够清晰的观察为了能够清晰的观察Service中中onCreate()、onStart()和和onDestroy()三个函数的调用顺序,在每个函数中都三个函数的调用顺序,在每个函数中都使用使用Toast在界面上产生提示信息在界面上产生提示信息7.2 本地服务本地服务n7.2.1 服务

    20、管理服务管理qRandomService.java文件的代码文件的代码1 package edu.hrbeu.SimpleRandomServiceDemo;2 3 import android.app.Service;4 import android.content.Intent;5 import android.os.IBinder;6 import android.widget.Toast;7 8 public class RandomService extends Service9 10 Override11 public void onCreate()12 super.onCreat

    21、e();13 Toast.makeText(this,(1)调用调用onCreate(),14 Toast.LENGTH_LONG).show();15 16 7.2 本地服务本地服务n7.2.1 服务管理服务管理17 Override18 public void onStart(Intent intent,int startId)19 super.onStart(intent,startId);20 Toast.makeText(this,(2)调用调用onStart(),21 Toast.LENGTH_SHORT).show();22 23 double randomDouble=Math

    22、.random();24 String msg=随机数:随机数:+String.valueOf(randomDouble);25 Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();26 27 28 Override29 public void onDestroy()30 super.onDestroy();31 Toast.makeText(this,(3)调用调用onDestroy(),32 Toast.LENGTH_SHORT).show();33 7.2 本地服务本地服务n7.2.1 服务管理服务管理n在在onStart()函数中添加生

    23、成随机数的代码,第函数中添加生成随机数的代码,第23行行生成一个介于生成一个介于0和和1之间的随机数之间的随机数n第第24行代码构造供行代码构造供Toast显示的消息显示的消息34 35 Override36 public IBinder onBind(Intent intent)37 return null;38 39 7.2 本地服务本地服务n7.2.1 服务管理服务管理qAndroidManifest.xml文件的代码如下文件的代码如下 1 2 6 7.2 本地服务本地服务n7.2.1 服务管理服务管理qAndroidManifest.xml文件的代码文件的代码n在调用在调用Androi

    24、dManifest.xml文件中,在文件中,在标标签下,包含一个签下,包含一个标签和一个标签和一个标签,在标签,在标签中,声明了标签中,声明了RandomService所在的类所在的类7 9 10 11 12 13 14 15 16 17 7.2 本地服务本地服务n7.2.1 服务管理服务管理qSimpleRandomServiceDemoActivity.java文件的代文件的代码如下码如下1 package edu.hrbeu.SimpleRandomServiceDemo;2 3 import android.app.Activity;4 import android.content.I

    25、ntent;5 import android.os.Bundle;6 import android.view.View;7 import android.widget.Button;8 9 public class SimpleRandomServiceDemoActivity extends Activity 10 Override11 public void onCreate(Bundle savedInstanceState)12 super.onCreate(savedInstanceState);13 setContentView(R.layout.main);14 7.2 本地服务

    26、本地服务n7.2.1 服务管理服务管理n第第20行和第行和第25行分别是启动和停止行分别是启动和停止Service的代码的代码15 Button startButton=(Button)findViewById(R.id.start);16 Button stopButton=(Button)findViewById(R.id.stop);17 final Intent serviceIntent=new Intent(this,RandomService.class);18 startButton.setOnClickListener(new Button.OnClickListener()

    27、19 public void onClick(View view)20 startService(serviceIntent);21 22 );23 stopButton.setOnClickListener(new Button.OnClickListener()24 public void onClick(View view)25 stopService(serviceIntent);26 27 );28 29 7.2 本地服务本地服务n7.2.2 使用线程使用线程qAndroid系统中工作在主线程上的组件系统中工作在主线程上的组件nActivitynServicenBroadcastRe

    28、ceiverq耗时的处理过程会降低用户界面的响应速度,甚至导致耗时的处理过程会降低用户界面的响应速度,甚至导致用户界面失去响应用户界面失去响应q当用户界面失去响应超过当用户界面失去响应超过5秒后,秒后,Android系统会允许用系统会允许用户强行关闭应用程序,提示如下图所示户强行关闭应用程序,提示如下图所示7.2 本地服务本地服务n7.2.2 使用线程使用线程q较好的解决方法较好的解决方法n将耗时的处理过程转移到子线程上将耗时的处理过程转移到子线程上n可以缩短主线程的事件处理时间可以缩短主线程的事件处理时间n避免用户界面长时间失去响应避免用户界面长时间失去响应q“耗时的处理过程耗时的处理过程”

    29、n复杂运算过程复杂运算过程n大量的文件操作大量的文件操作n存在延时的网络通讯存在延时的网络通讯n数据库操作等数据库操作等7.2 本地服务本地服务n7.2.2 使用线程使用线程q线程是独立的程序单元,多个线程可以并行工作线程是独立的程序单元,多个线程可以并行工作q无论线程是否真的并行工作,在宏观上可以认为子线程无论线程是否真的并行工作,在宏观上可以认为子线程是独立于主线程的,且能与主线程并行工作的程序单元是独立于主线程的,且能与主线程并行工作的程序单元多处理器系统多处理器系统单处理器系统单处理器系统并行工作方式并行工作方式每个中央处理器每个中央处理器(CPU)单独运)单独运行一个线程行一个线程给

    30、每个线程一小段时给每个线程一小段时间,在这个时间内线间,在这个时间内线程是被执行的,然后程是被执行的,然后执行下一个线程执行下一个线程并行或并发并行或并发并行工作并行工作并行运行的假象并行运行的假象7.2 本地服务本地服务n7.2.2 使用线程使用线程q建立和使用线程建立和使用线程n实现实现Java的的Runnable接口接口n重载重载run()函数,在函数,在run()中放置代码的主体部分中放置代码的主体部分1 private Runnable backgroundWork=new Runnable()2 Override3 public void run()4 /过程代码过程代码5 6 ;

    31、7.2 本地服务本地服务n7.2.2 使用线程使用线程q建立和使用线程建立和使用线程n创建创建Thread对象,并将对象,并将Runnable对象作为参数传递对象作为参数传递给给Thread对象对象nThread的构造函数的构造函数q第第1个参数用来表示线程组个参数用来表示线程组q第第2个参数是需要执行的个参数是需要执行的Runnable对象对象q第第3个参数是线程的名称个参数是线程的名称n调用调用start()方法启动线程方法启动线程1 private Thread workThread;2 workThread=new Thread(null,backgroundWork,WorkThre

    32、ad);1 workThread.start();7.2 本地服务本地服务n7.2.2 使用线程使用线程q当线程在当线程在run()方法返回后,线程就自动终止了方法返回后,线程就自动终止了q不推荐使用调用不推荐使用调用stop()在外部终止线程,因为这方在外部终止线程,因为这方法并不安全,有可能会产生异常法并不安全,有可能会产生异常q最好的方法最好的方法n通知线程自行终止通知线程自行终止n调用调用interrupt()方法通告线程准备终止方法通告线程准备终止n线程会释放它正在使用的资源,在完成所有的清理工线程会释放它正在使用的资源,在完成所有的清理工作后自行终止作后自行终止1 workThre

    33、ad.interrupt();7.2 本地服务本地服务n7.2.2 使用线程使用线程ninterrupt()方法并不能直接终止线程方法并不能直接终止线程q仅是改变了线程内部的一个布尔值仅是改变了线程内部的一个布尔值qrun()方法能够检测到这个布尔值的改变方法能够检测到这个布尔值的改变q在适当的时候释放资源和终止线程在适当的时候释放资源和终止线程n在在run()中的代码通过中的代码通过Thread.interrupted()方法查询方法查询线程是否被中断线程是否被中断n一般情况下,子线程需要无限运行一般情况下,子线程需要无限运行q除非外部调用除非外部调用interrupt()方法中断线程方法中

    34、断线程q通常会将程序主体放置在通常会将程序主体放置在while()函数内函数内q调用调用Thread.interrupted()方法判断线程是否应被中断方法判断线程是否应被中断7.2 本地服务本地服务n7.2.2 使用线程使用线程q下面的代码以下面的代码以1秒为间隔循环检测线程是否应被秒为间隔循环检测线程是否应被中断中断n第第4 4行代码使线程休眠行代码使线程休眠10001000毫秒毫秒1 public void run()2 while(!Thread.interrupted()3 /过程代码过程代码4 Thread.sleep(1000);5 6 7.2 本地服务本地服务n7.2.2 使用

    35、线程使用线程n当线程在休眠过程中被中断,则会产生当线程在休眠过程中被中断,则会产生InterruptedException异常异常n代码中需要捕获代码中需要捕获InterruptedException异常,保证异常,保证安全终止线程安全终止线程1 public void run()2 try 3 while(true)4 /过程代码过程代码5 Thread.sleep(1000);6 7 catch(InterruptedException e)8 e.printStackTrace();9 10 7.2 本地服务本地服务n7.2.2 使用线程使用线程q使用线程中的数据更新用户界面使用线程中的

    36、数据更新用户界面qAndroid系统系统提供了多种方法解决这个问题提供了多种方法解决这个问题q使用使用Handler更新用户界面更新用户界面nHandler允许将允许将Runnable对象发送到线程的消息队对象发送到线程的消息队列中,每个列中,每个Handler实例绑定到一个单独的线程和消实例绑定到一个单独的线程和消息队列上息队列上n建立一个新的建立一个新的Handler实例实例q通过通过post()方法将方法将Runnable对象从后台线程发送给对象从后台线程发送给GUI线程的消息队列线程的消息队列q当当Runnable对象通过消息队列后,这个对象通过消息队列后,这个Runnable对对象将

    37、被运行象将被运行7.2 本地服务本地服务n7.2.2 使用线程使用线程1 private static Handler handler=new Handler();2 3 public static void UpdateGUI(double refreshDouble)4 handler.post(RefreshLable);5 6 private static Runnable RefreshLable=new Runnable()7 Override8 public void run()9 /过程代码过程代码10 11 ;7.2 本地服务本地服务n7.2.2 使用线程使用线程n第第1行建

    38、立了一个静态的行建立了一个静态的Handler实例实例q这个实例是私有的,因此外部代码并不能直接调用这这个实例是私有的,因此外部代码并不能直接调用这个个Handler实例实例n第第3行行UpdateGUI()是公有的界面更新函数是公有的界面更新函数q后台线程通过调用该函数,将后台产生的数据后台线程通过调用该函数,将后台产生的数据refreshDouble传递到传递到UpdateGUI()函数内部函数内部q直接调用直接调用post()方法,将第方法,将第6行创建的行创建的Runnable对象传对象传递给界面线程(主线程)的消息队列中递给界面线程(主线程)的消息队列中n第第8行到第行到第10行代码

    39、是行代码是Runnable对象中需要重载的对象中需要重载的run()函数,界面更新代码就在这里函数,界面更新代码就在这里7.2 本地服务本地服务n7.2.2 使用线程使用线程qThreadRandomServiceDemo是使用线程持续产生随是使用线程持续产生随机数的示例机数的示例n点击点击“启动启动Service”后将启动后台线程后将启动后台线程n点击点击“停止停止Service”将关闭后台线程将关闭后台线程n后台线程每后台线程每1秒钟产生一个秒钟产生一个0到到1之间的随机数,并通过之间的随机数,并通过Handler将产生的随机数显示在用户界面上,如下图所示将产生的随机数显示在用户界面上,如

    40、下图所示7.2 本地服务本地服务n7.2.2 使用线程使用线程q在在ThreadRandomServiceDemo示例中示例中RandomService.javau定义定义Serviceu创建线程创建线程u产生随机数产生随机数u调用界面更新函数调用界面更新函数ThreadRandomServiceDemoActivity.javau用户界面的用户界面的Activity文件文件u封装封装Handler界面更新的函数界面更新的函数启动启动7.2 本地服务本地服务n7.2.2 使用线程使用线程nRandomService.java文件代码文件代码1 package edu.hrbeu.ThreadR

    41、andomServiceDemo;2 3 import android.app.Service;4 import android.content.Intent;5 import android.os.IBinder;6 import android.widget.Toast;7 8 public class RandomService extends Service9 10 private Thread workThread;11 12 Override7.2 本地服务本地服务n7.2.2 使用线程使用线程13 public void onCreate()14 super.onCreate()

    42、;15 Toast.makeText(this,(1)调用调用onCreate(),16 Toast.LENGTH_LONG).show();17 workThread=new Thread(null,backgroundWork,WorkThread);18 19 20 Override21 public void onStart(Intent intent,int startId)22 super.onStart(intent,startId);23 Toast.makeText(this,(2)调用调用onStart(),24 Toast.LENGTH_SHORT).show();25

    43、if(!workThread.isAlive()26 workThread.start();27 28 29 7.2 本地服务本地服务n7.2.2 使用线程使用线程30 Override31 public void onDestroy()32 super.onDestroy();33 Toast.makeText(this,(3)调用调用onDestroy(),34 Toast.LENGTH_SHORT).show();35 workThread.interrupt();36 37 38 Override39 public IBinder onBind(Intent intent)40 ret

    44、urn null;41 42 7.2 本地服务本地服务n7.2.2 使用线程使用线程43 private Runnable backgroundWork=new Runnable()44 Override45 public void run()46 try 47 while(!Thread.interrupted()48 double randomDouble=Math.random();49 ThreadRandomServiceDemoActivity.UpdateGUI(randomDouble);50 Thread.sleep(1000);51 52 catch(Interrupted

    45、Exception e)53 e.printStackTrace();54 55 56 ;57 7.2 本地服务本地服务n7.2.2 使用线程使用线程nThreadRandomServiceDemoActivity.java文件代码文件代码 1 package edu.hrbeu.ThreadRandomServiceDemo;2 3 import android.app.Activity;4 import android.content.Intent;5 import android.os.Bundle;6 import android.os.Handler;7 import android

    46、.view.View;8 import android.widget.Button;9 import android.widget.TextView;10 11 public class ThreadRandomServiceDemoActivity extends Activity 12 7.2 本地服务本地服务n7.2.2 使用线程使用线程13 private static Handler handler=new Handler();14 private static TextView labelView=null;15 private static double randomDouble

    47、;16 17 public static void UpdateGUI(double refreshDouble)18 randomDouble=refreshDouble;19 handler.post(RefreshLable);20 21 22 private static Runnable RefreshLable=new Runnable()23 Override24 public void run()25 labelView.setText(String.valueOf(randomDouble);26 27 ;28 7.2 本地服务本地服务n7.2.2 使用线程使用线程29 Ov

    48、erride30 public void onCreate(Bundle savedInstanceState)31 super.onCreate(savedInstanceState);32 setContentView(R.layout.main);33 labelView=(TextView)findViewById(R.id.label);34 Button startButton=(Button)findViewById(R.id.start);35 Button stopButton=(Button)findViewById(R.id.stop);36 final Intent s

    49、erviceIntent=new Intent(this,RandomService.class);37 38 startButton.setOnClickListener(new Button.OnClickListener()39 public void onClick(View view)40 startService(serviceIntent);41 42 );43 7.2 本地服务本地服务n7.2.2 使用线程使用线程44 stopButton.setOnClickListener(new Button.OnClickListener()45 public void onClick

    50、(View view)46 stopService(serviceIntent);47 48 );49 50 7.2 本地服务本地服务n7.2.3 服务绑定服务绑定q以绑定方式使用以绑定方式使用Servicen能够获取到能够获取到Service实例实例n能够正常启动能够正常启动Servicen能够调用能够调用Service中的公有方法和属性中的公有方法和属性q为了使为了使Service支持绑定支持绑定n需要在需要在Service类中重载类中重载onBind()方法方法n在在onBind()方法中返回方法中返回Service实例实例n示例代码如下示例代码如下7.2 本地服务本地服务n7.2.3

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第7章后台服务学习培训模板课件.ppt
    链接地址:https://www.163wenku.com/p-4163046.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库