Android第一行代码 第9章.doc_第1页
Android第一行代码 第9章.doc_第2页
Android第一行代码 第9章.doc_第3页
Android第一行代码 第9章.doc_第4页
Android第一行代码 第9章.doc_第5页
免费预览已结束,剩余17页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章后台默默的劳动者,探究服务1. 在三大智能手机操作系统中,_是不支持后台的,当应用程序不在前台运行时就会进入到挂起状态。_则完全支持后台功能,这使得应用程序即使在关闭的情况下仍然可以在后台继续运行。而_则是经历了一个由不支持到支持后台的过程,目前也具备了后台功能。答:iOSAndroidWindows Phone2. 默认情况下,Android所有应用中的组件不但运行在同一进程中,而且也运行在此进程的同一线程中,这一线程被称为_。答:主线程3. Android主线程负责分发事件给相应的用户界面组件,包括绘制用户界面的事件,在主线程中应用与 Android UI交互,因此,主线程又被称为_线程。答:UI(主线程)4. 在 Android 应用中,只有_线程能够维护和更新 UI组件的状态,因此,用户界面是一种单线程模型。答:UI5. 当Android应用需要执行一些耗时操作时,如果不将这类操作放在子线程里去运行,就会导致_被阻塞,从而影响用户对软件的正常使用。答:主线程6. Android的UI组件不是线程安全的, 在子线程中更新UI会导致_。答:程序崩溃7. Android多线程编程基本模式与Java多线程编程相同,主要有两种基本模式:即定义一个继承自_的线程类和定义一个实现_接口的类。答:ThreadRunnable8. Android 系统异步消息通信机制由以下类组成:_、_、MessageQueue和Looper。答:MessageHandler9. 在Android 系统异步消息通信机制中,_是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。其中,包括交由Handler对象发送的数据,对象中还有可以使用若干附加字段承载数据,主要两个int型字段和一个Object型字段。答:Message10. 在Android 系统异步消息通信机制中,_主要用于发送和处理消息。发送消息一般使用它的sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到它的handleMessage()方法中。答:Handler11. 在Android 系统异步消息通信机制中,_是消息队列,用来存放通过 Handler 发布的消息,消息按照先进先出的队列原则等待被处理。答:MessageQueu12. 在Android 系统异步消息通信机制中,_是MessageQueue的管理者,它驱使消息在队列中前进。答:Looper13. 请简述在Handle-Message异步消息通信机制中子线程中进行UI操作的编程逻辑。答:(1)首先,在主线程当中创建一个Handler对象,并重写handleMessage()方法。(2)然后,当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将消息发送出去。(3)之后,这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的handleMessage()方法中。(4)由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,于是就可以地进行UI操作了。14. 请阅读下面程序片断,根据注释在空白划线处填写代码。/ 创建Handler对象,重写其handleMessage()方法,接收Message消息对象private Handler handler = _ / 重写handleMessage()方法public void _ (Message msg) _ / 判断消息中携带的what字段内容case UPDATE_TEXT:/ 当what字段内容与常量UPDATE_TEXT的值相符时text.setText(Nice to meet you);/ 修改text显示文本break;default:break;答:(1)new Handler()(2)handleMessage(3)switch (msg.what)15. 请阅读下面程序片断,根据注释在空白划线处填写代码。(1)_ / 开辟新线程,创建Runnable对象Overridepublic void run() / 实现run()方法/ 新建Message类的对象message(2)_ ;/ 设置对象message的what字段值为常量UPDATE_TEXT(3)_ ;/ 调用对象handler的sendMessage()方法发送该消息对象(4)_ ;).(5)_;/ 启动线程答:(1)new Thread(new Runnable()(2)Message message = new Message();(3)message.what = UPDATE_TEXT(4)handler.sendMessage(message)(5)start()16. _是 Asynchronous Task (异步任务)的缩写,“异步任务”是指一项任务运行在一个_线程中,而它的运行结果却由另外一个_线程发布,也就是说,同一个类中包含了运行在不同线程中的方法。答:AsyncTask后台UI17. 请简述AsyncTask在应用中编程逻辑。答:(1)首先,定义继承AsyncTask的子类,在其中通常需要实现以下方法;(2)实现 doInBackground() 回调方法,这是运行在后台线程中的方法。(3)为了更新用户界面 UI, 应该实现 onPostExecute() 方法,这是运行在前台UI 线程中的方法,负责接收doInBackground() 方法的返回结果,以便安全地更新 UI。(4)在 UI 线程中创建 AsyncTask 类对象,调用AsyncTask对象的 execute() 方法启动AsyncTask后台任务执行。18. AsyncTask类最大的特点是同一个类中既有运行于_中的方法,也有运行于_中的方法,将运行在不同线程中的方法组合在同一个类中,借助_或_在方法之间传递数据,实现了线程间的数据传递。答:主线程后台线程方法参数返回值19. doInBackground()方法在AsyncTask类对象启动后,运行于_中,而它的_又作为_传递给onPostExecute()方法,同样,onPostExecute()方法在doBackground()运行结束后立即开始运行于_中,显然doBackground() 和onPostExecute() 在运行时间上存在异步关系。答:后台线程返回值参数UI主线程20. 在doInBackground()方法中调用 _ 方法,可以将后台任务运行过程中产生的一些中间结果作为参数传递给运行在UI线程中 onProgressUpdate() 方法答:publishProgress()21. 但某些情况下,开发者希望变量能适用于多种数据类型,即定义变量的类型为“通用类型”(Generic Type),在实际使用时再指定它的具体类型。这就是_的基本思想。答:泛型22. AsyncTask 类是个泛型(Generics)类,使用了_个泛型(Generic Type)参数。答:323. AsyncTask类的第1个泛型参数规定了执行后台任务的_方法的参数类型。答:doInBackground()24. AsyncTask的后台任务doInBackground( )方法运行过程中,如果有些中间结果需要传递回UI主线程,可以调用_方法,将中间结果作为这个方法的参数传递给运行在主线程中的_方法,这两个方法的数据类型就是中间结果数据类型,由AsyncTask类的第_个泛型参数指定。答:publishProgress()onProgressUpdate()225. AsyncTask的后台任务方法 doInBackground()返回值将会作为参数传递给运行在主线程中的 _、 _方法,因此,三者的数据类型都是由AsyncTask类的第_个泛型参数指定。答:onCancelled()onPostExecute()326. AsyncTask泛型参数并不是都要用的,当某个类型变量在实际程序中不需要时,定义AsyncTask类时,在相应的泛型参数位置上使用_,它相当于一个占位符。答:Void27. 调用 AsyncTask对象_方法可以取消任务。调用这个方法后,随后调用 isCancelled() 方法将返回 true。调用这个方法,还会引起在 doInBackground() 方法返回后,调用 _而不再调用 onPostExecute() 方法。答:cancel(boolean)onCancelled(Object)28. 为了保证 AsyncTask 类正常工作, AsyncTask类实例必须在_线程中创建。答:UI29. 为了保证 AsyncTask 类正常工作,execute()方法必须在_线程中调用。答:UI 30. AsyncTask任务只能执行一次,如果试图第二次去执行任务会_。答:抛出异常31. 下面代码是一个AsyncTask应用的程序框架,请你根据已有代码在空白划线处填写所需代码。private class DownloadFilesTask extends AsyncTask protected Long doInBackground(URL. urls) int count = urls.length; long totalSize = 0; for (int i = 0; i count; i+) totalSize += Downloader.downloadFile(urlsi); int progress = (int) (i / (float) count) * 100); publishProgress(progress); / Escape early if cancel() is called if (isCancelled() break; return totalSize; protected void onProgressUpdate((3)_ ) setProgressPercent(progress0); protected void onPostExecute ((4)_ ) showDialog(Downloaded + result + bytes); DownloadFilesTask task= new DownloadFilesTask(); task.(5)_ ( url1, url2, url3 ); 答:(1)URL(2)Long(3)Integer. Progress(4)Long result(5)execute32. _ 是指运行在后台的一种Android应用组件,由于不需要与用户直接交互,因此并没有自己的用户界面。答:Service 33. Service 运行有两种模式,其中,调用应用组件(如 Acitivity )的 _ 方法启动 Service 实例的模式通常称为启动模式,这种模式在后台运行时,不会向Activity等组件提供操作功能调用。答:startService()34. Service 运行有两种模式,其中,调用应用组件(如 Acitivity )的 _ 方法启动Service 实例的模式通常称为绑定模式,这种模式在后台运行时可以向Activity等其他组件提供操作功能调用。答:bindService()35. Service 启动后将一直处于运行状态,即使调用它的进程结束了,Service 仍然存在,直到有别的进程调用 _,或者 Service 自己调用_才会结束运行。答:stopService()stopSelf()36. 在使用startService()启动Service时,Service类通常会用到onCreate()、_和onDestroy()这三个最常用方法。答:onStartCommand()37. 在使用bindService() 方法 Service 时,将回调_方法返回给客户端一个 Ibinder 接口实例,Ibinder 允许客户端回调 Service 的方法。答:onBind() 38. 通过调用bindService() 方法绑定的 Service 对象可以通过调用_ 方法解除绑定。答:unbindService()39. 在绑定模式下, Activity解除与 Service 绑定时,将依次回调用Service的_和 onDestroy() 方法退出绑定。答:onUnbind()40. Service作为应用组件需要在_文件中进行注册才能生效。答:AndroidManifest.xml41. 从Service生命周期角度来看onCreate() 和onStartCommand()有何区别?答:(1)onCreate()方法是在服务第一次创建的时候调用;(2)onStartCommand()方法则在每次启动服务的时候都会调用。(3)第一次创建服务时,先执行onCreate()方法,后执行 onStartCommand()方法。42. 请简述在Activity中以startService()方法启动Service的编程逻辑。答:在Activity中:(1)创建发送给Service类的意图对象;(2)用上面建立的意图对象作为参数调用startService()方法启动Service;在Sertvice中:(1) onCreate() 方法中编写首次创建Service实例所需代码;(2)在onStartCommand() 方法中编写每次启动服务时要完成工作的代码;(3)onBind()方法返回值为null;(4)onDestroy()方法中编写Service类销毁时处理的代码。注意:Service 启动后将一直处于运行状态,即使调用它的进程结束了,Service 仍然存在,因此,开发者在启动 Service 完成指定操作后应主动关闭它,以免造成资源浪费。可以在Activity中根据应用需要在合适位置调用 stopService()停止服务,或者在Service中调用stopSelf() 结束运行。43. 下面是一个提供绑定服务的Service类程序片断,请阅读程序后简述该类中实现绑定服务主要编程逻辑。public class MyService extends Service private DownloadBinder mBinder = new DownloadBinder();class DownloadBinder extends Binder public void startDownload() Log.d(MyService, startDownload executed);public int getProgress() Log.d(MyService, getProgress executed);return 0;Overridepublic IBinder onBind(Intent intent) Log.d(MyService, onBind executed);return mBinder; .Overridepublic void onDestroy() super.onDestroy();Log.d(MyService, onDestroy executed);答:(1)在服务( Service )里自定义一个继承了Binder的类DownloadBinder,类中定义了Service准备提供给Activity使用的方法startDownload()和getProgress();(2)接着,在Service中创建这个自定义Binder类的对象mBinder;(3)然后,由onBind()方法在收到绑定意图后返回mBinder对象,Activity就可以通过这个对象访问Service提供的功能了。(4)最后,在onDestroy()方法中编写Service类销毁时处理的代码。44. 下面是一个需要绑定服务的Activity类程序片断,请阅读程序后简述该类主要编程逻辑。public class MainActivity extends Activity implements OnClickListener private Button bindService;private Button unbindService;private MyService.DownloadBinder downloadBinder;private ServiceConnection connection = new ServiceConnection() Overridepublic void onServiceDisconnected(ComponentName name) Overridepublic void onServiceConnected(ComponentName name, IBinder service) downloadBinder = (MyService.DownloadBinder) service;Log.d(MainActivity, onServiceConnected!);downloadBinder.startDownload();downloadBinder.getProgress();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindService = (Button) findViewById(R.id.bind_service);unbindService = (Button) findViewById(R.id.unbind_service);bindService.setOnClickListener(this);unbindService.setOnClickListener(this);Overridepublic void onClick(View v) switch (v.getId() case R.id.bind_service:Intent bindIntent = new Intent(this, MyService.class);bindService(bindIntent, connection, BIND_AUTO_CREATE);break;case R.id.unbind_service:unbindService(connection);break;default:break;答:(1)在Activity里实现ServiceConnection接口并创建其对象connection,这个接口对象负责监听与Service的连接状况;(2)实现ServiceConnection接口类时,需重写两个回调方法:onServiceConnected()和onServiceDisconnected() ,这两个方法分别在活动与服务成功绑定或解除绑定的时候被系统回调。(3)onServiceConnected()方法的参数可接收到绑定服务组件名称和 Binder实例,通过这个Binder实例, Activity就可以调用Service提供方法:startDownload()和getProgress()。(4)在Activity界面布局中提供id号为R.id.bind_service的按钮用于绑定服务,提供id号为R.id.unbind_service的按钮用于解除服务,并为按钮设置点击监听器。(5)在按钮监听方法onClick()中为R.id.bind_service按钮创建发送给服务MyService.类的意图,并调用bindService()方法与该服务绑定;同时,为R.id.unbind_service按钮提供unbindService()方法解除与服务的绑定。45. 阅读下面程序片断,请说明IntentService类运行逻辑。public class MyIntentService extends IntentService public MyIntentService() super(MyIntentService);Overrideprotected void onHandleIntent(Intent intent) Log.d(MyIntentService, Thread id is + Thread.currentThread().getId();Overridepublic void onDestroy() super.onDestroy();Log.d(MyIntentService, onDestroy executed);答:(1)IntentService类提供了 onStartCommand() 方法的默认实现,它将所有收到的 Intent 转发到工作队列中,等候 onHandleIntent() 方法处理;(2)IntentService 对象会创建一个工作队列,让接收到的 Intent排队等候 onHandleIntent()处理,开发人员不需要考虑多线程同步问题;(3)当所有请求被处理完成后, IntentService 对象将自动停止服务而不需要开发人员显式地调用stopSelf() 方法。46. Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的_类,一种是使用Android的_机制。答:TimerAlarm47. Java API里已经提供的Timer类实现定时方式,为何Android还要引入提供相似功能的Alarm机制?答:(1)Timer有一个明显的短板,Android手机在长时间不操作的情况下会自动让CPU进入到睡眠状态,这就有可能导致Timer中的定时任务无法正常运行。(2)Alarm机制具有唤醒CPU的功能,可以保证每次需要执行定时任务的时候CPU都能正常工作。需要注意:这里唤醒CPU和唤醒屏幕完全不是同一个概念,千万不要产生混淆。48. 在Android定时机制中, _能在指定时间点触发 Intent,自动启动程序执行某种动作,此时,应用程序并不需要打开或者处于活跃状态。答:Alarm49. Android 以系统服务的方式提供 Alarm 功能,_类提供了访问 Alarm 系统服务的途径,允许将应用程序安排在未来某个时间点启动。答:AlarmManager50. 调用AlarmManager类对象的set()方法时,第1个参数表示定时类型,有4种值可选,其中:ELAPSED_REALTIME表示定时任务的触发时间从_开始算起,但到时_(会/不会)唤醒CPU。答:系统开机不会51. 调用AlarmManager类对象的set()方法时,第1个参数表示定时类型,有4种值可选,其中:ELAPSED_REALTIME_WAKEUP表示定时任务的触发时间从_开始算起,但到时_(会/不会)唤醒CPU。答:系统开机会52. 调用AlarmManager类对象的set()方法时,第1个参数表示定时类型,有4种值可选,其中:RTC表示定时任务的触发时间从_开始算起,但到时_(会/不会)唤醒CPU。答:1970年1月1日0点不会53. 调用AlarmManager类对象的set()方法时,第1个参数表示定时类型,有4种值可选,其中:RTC_WAKEUP表示定时任务的触发时间从_开始算起,但到时_(会/不会)唤醒CPU。答:1970年1月1日0点会54. 使用_方法可以获取到系统开机至今所经历时间的毫秒数,使用_方法可以获取到1970年1月1日0点至今所经历时间的毫秒数。答:SystemClock.elapsedRealtime()System.currentTimeMillis()55. 请根据下面程序片断中注释提示在空白划线处填写代码。public int onStartCommand(Intent intent, int flags, int startId) / 调用名为“ALARM_SERVICE”的系统服务,取得AlarmManager类对象manager(1)_;/ 以毫秒为单位设置时长1小时,保存到整型变量anHourint anHour = 60 * 60 * 1000;/ 以毫秒为单位,取得系统从启动到现在的实际时间,/ 并加时1小时,保存到长整型变量triggerAt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论