Android第一行代码 第9章.docx
- 文档编号:10407727
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:21
- 大小:23.56KB
Android第一行代码 第9章.docx
《Android第一行代码 第9章.docx》由会员分享,可在线阅读,更多相关《Android第一行代码 第9章.docx(21页珍藏版)》请在冰豆网上搜索。
Android第一行代码第9章
第9章 后台默默的劳动者,探究服务
1.在三大智能手机操作系统中,_________________是不支持后台的,当应用程序不在前台运行时就会进入到挂起状态。
_________________则完全支持后台功能,这使得应用程序即使在关闭的情况下仍然可以在后台继续运行。
而_________________则是经历了一个由不支持到支持后台的过程,目前也具备了后台功能。
答:
iOS
Android
WindowsPhone
2.默认情况下,Android所有应用中的组件不但运行在同一进程中,而且也运行在此进程的同一线程中,这一线程被称为_________________。
答:
主线程
3.Android主线程负责分发事件给相应的用户界面组件,包括绘制用户界面的事件,在主线程中应用与AndroidUI交互,因此,主线程又被称为_________________线程。
答:
UI(主线程)
4.在Android应用中,只有_________________线程能够维护和更新UI组件的状态,因此,用户界面是一种单线程模型。
答:
UI
5.当Android应用需要执行一些耗时操作时,如果不将这类操作放在子线程里去运行,就会导致_________________被阻塞,从而影响用户对软件的正常使用。
答:
主线程
6.Android的UI组件不是线程安全的,在子线程中更新UI会导致_________________。
答:
程序崩溃
7.Android多线程编程基本模式与Java多线程编程相同,主要有两种基本模式:
即定义一个继承自_________________的线程类和定义一个实现_________________接口的类。
答:
Thread
Runnable
8.Android系统异步消息通信机制由以下类组成:
_________________、_________________、MessageQueue和Looper。
答:
Message
Handler
9.在Android系统异步消息通信机制中,_________________是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。
其中,包括交由Handler对象发送的数据,对象中还有可以使用若干附加字段承载数据,主要两个int型字段和一个Object型字段。
答:
Message
10.在Android系统异步消息通信机制中,_________________主要用于发送和处理消息。
发送消息一般使用它的sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到它的handleMessage()方法中。
答:
Handler
11.在Android系统异步消息通信机制中,_________________是消息队列,用来存放通过Handler发布的消息,消息按照先进先出的队列原则等待被处理。
答:
MessageQueu
12.在Android系统异步消息通信机制中,_________________是MessageQueue的管理者,它驱使消息在队列中前进。
答:
Looper
13.请简述在Handle-Message异步消息通信机制中子线程中进行UI操作的编程逻辑。
答:
(1)首先,在主线程当中创建一个Handler对象,并重写handleMessage()方法。
(2)然后,当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将消息发送出去。
(3)之后,这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的handleMessage()方法中。
(4)由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,于是就可以地进行UI操作了。
14.请阅读下面程序片断,根据注释在空白划线处填写代码。
//创建Handler对象,重写其handleMessage()方法,接收Message消息对象
privateHandlerhandler=_________________{
//重写handleMessage()方法
publicvoid_________________(Messagemsg){
_________________{//判断消息中携带的what字段内容
case当what字段内容与常量UPDATE_TEXT的值相符时
text.setText("Nicetomeetyou");//修改text显示文本
break;
default:
break;
}
}
};
答:
(1)newHandler()
(2)handleMessage
(3)switch(msg.what)
15.请阅读下面程序片断,根据注释在空白划线处填写代码。
(1)_________________{//开辟新线程,创建Runnable对象
@Override
publicvoidrun(){//实现run()方法
//新建Message类的对象message
(2)_______________________________;
//设置对象message的what字段值为常量UPDATE_TEXT
(3)_______________________________;
//调用对象handler的sendMessage()方法发送该消息对象
(4)_______________________________;
}
}).(5)__________________;//启动线程
答:
(1)newThread(newRunnable()
(2)Messagemessage=newMessage();
(3)message.what=UPDATE_TEXT
(4)handler.sendMessage(message)
(5)start()
16._________________是AsynchronousTask(异步任务)的缩写,“异步任务”是指一项任务运行在一个_________________线程中,而它的运行结果却由另外一个_________________线程发布,也就是说,同一个类中包含了运行在不同线程中的方法。
答:
AsyncTask
后台
UI
17.请简述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.但某些情况下,开发者希望变量能适用于多种数据类型,即定义变量的类型为“通用类型”(GenericType),在实际使用时再指定它的具体类型。
这就是_________________的基本思想。
答:
泛型
22.AsyncTask类是个泛型(Generics)类,使用了_________________个泛型(GenericType)参数。
答:
3
23.AsyncTask类的第1个泛型参数规定了执行后台任务的_________________方法的参数类型。
答:
doInBackground()
24.AsyncTask的后台任务doInBackground()方法运行过程中,如果有些中间结果需要传递回UI主线程,可以调用_________________方法,将中间结果作为这个方法的参数传递给运行在主线程中的_________________方法,这两个方法的数据类型就是中间结果数据类型,由AsyncTask类的第_________________个泛型参数指定。
答:
publishProgress()
onProgressUpdate()
2
25.AsyncTask的后台任务方法doInBackground()返回值将会作为参数传递给运行在主线程中的_________________、_________________方法,因此,三者的数据类型都是由AsyncTask类的第_________________个泛型参数指定。
答:
onCancelled()
onPostExecute()
3
26.AsyncTask泛型参数并不是都要用的,当某个类型变量在实际程序中不需要时,定义AsyncTask类时,在相应的泛型参数位置上使用_________________,它相当于一个占位符。
答:
Void
27.调用AsyncTask对象_________________方法可以取消任务。
调用这个方法后,随后调用isCancelled()方法将返回true。
调用这个方法,还会引起在doInBackground()方法返回后,调用_________________而不再调用onPostExecute()方法。
答:
cancel(boolean)
onCancelled(Object)
28.为了保证AsyncTask类正常工作,AsyncTask类实例必须在_________________线程中创建。
答:
UI
29.为了保证AsyncTask类正常工作,execute()方法必须在_________________线程中调用。
答:
UI
30.AsyncTask任务只能执行一次,如果试图第二次去执行任务会________________。
答:
抛出异常
31.下面代码是一个AsyncTask应用的程序框架,请你根据已有代码在空白划线处填写所需代码。
privateclassDownloadFilesTaskextendsAsyncTask<
(1)______,Integer,
(2)______>{
protectedLongdoInBackground(URL...urls){
intcount=urls.length;
longtotalSize=0;
for(inti=0;i totalSize+=Downloader.downloadFile(urls[i]); intprogress=(int)((i/(float)count)*100); publishProgress(progress); //Escapeearlyifcancel()iscalled if(isCancelled())break; } returntotalSize; } protectedvoidonProgressUpdate((3)________________){ setProgressPercent(progress[0]); } protectedvoidonPostExecute((4)________________){ showDialog("Downloaded"+result+"bytes"); } } DownloadFilesTasktask=newDownloadFilesTask(); task.(5)________________(url1,url2,url3); 答: (1)URL (2)Long (3)Integer...Progress (4)Longresult (5)execute 32.________________是指运行在后台的一种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.xml 41.从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类程序片断,请阅读程序后简述该类中实现绑定服务主要编程逻辑。 publicclassMyServiceextendsService{ privateDownloadBindermBinder=newDownloadBinder(); classDownloadBinderextendsBinder{ publicvoidstartDownload(){ Log.d("MyService","startDownloadexecuted"); } publicintgetProgress(){ Log.d("MyService","getProgressexecuted"); return0; } } @Override publicIBinderonBind(Intentintent){ Log.d("MyService","onBindexecuted"); returnmBinder; } ….. @Override publicvoidonDestroy(){ super.onDestroy(); Log.d("MyService","onDestroyexecuted"); } } 答: (1)在服务(Service)里自定义一个继承了Binder的类DownloadBinder,类中定义了Service准备提供给Activity使用的方法startDownload()和getProgress(); (2)接着,在Service中创建这个自定义Binder类的对象mBinder; (3)然后,由onBind()方法在收到绑定意图后返回mBinder对象,Activity就可以通过这个对象访问Service提供的功能了。 (4)最后,在onDestroy()方法中编写Service类销毁时处理的代码。 44.下面是一个需要绑定服务的Activity类程序片断,请阅读程序后简述该类主要编程逻辑。 publicclassMainActivityextendsActivityimplementsOnClickListener{ privateButtonbindService; privateButtonunbindService; privateMyService.DownloadBinderdownloadBinder; privateServiceConnectionconnection=newServiceConnection(){ @Override publicvoidonServiceDisconnected(ComponentNamename){ } @Override publicvoidonServiceConnected(ComponentNamename,IBinderservice){ downloadBinder=(MyService.DownloadBinder)service; Log.d("MainActivity","onServiceConnected! "); downloadBinder.startDownload(); downloadBinder.getProgress(); } }; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(; bindService=(Button)findViewById(; unbindService=(Button)findViewById(; bindService.setOnClickListener(this); unbindService.setOnClickListener(this); } @Override publicvoidonClick(Viewv){ switch(v.getId()){ case IntentbindIntent=newIntent(this,MyService.class); bindService(bindIntent,connection,BIND_AUTO_CREATE); break; case unbindService(connection); break; default: break; } } } 答: (1)在Activity里实现ServiceConnection接口并创建其对象connection,这个接口对象负责监听与Service的连接状况; (2)实现ServiceConnection接口类时,需重写两个回调方法: onServiceConnected()和onServiceDisconnected(),这两个方法分别在活动与服务成功绑定或解除绑定的时候被系统回调。 (3)onServiceConnected()方法的参数可接收到绑定服务组件名称和Binder实例,通过这个Binder实例,Activity就可以调用Servi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android第一行代码 第9章 Android 一行 代码