您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 苏州大学Android【韩冬】期末复习
..《Android应用开发》复习题:1.Android的体系结构是怎样的?请简要加以说明。Android的系统架构采用了分层架构的思想。从上层到底层共包括四层:应用层、应用框架层、系统运行库层、Linux内核层。2.Android程序结构是怎样的?请简要加以分析。src目录:java源代码gen目录:BuildConfig.java、R.javares目录:res目录是资源目录,可以存放应用使用到的各种资源,如XML界面文件、图片、数据等。assets目录:assets资源目录一般可用于存放html文件、数据库文件、javascript文件等,还有原始格式的文件.AndroidManifest.xml:列出了应用程序提供的功能,开发好的各种组件需要在此文件中进行配置,当应用使用到系统内置的应用还需在此文件中声明使用权限3.Handler消息传递机制是怎样的?试以“计时器”的编程举例加以说明。首先需要在主线程当中创建一个Handler对象,并重写handleMessage()方法。然后当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的handleMessage()方法中。由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行UI操作了。一条Message经过这样一个流程的辗转调用后,也就从子线程进入到了主线程,从不能更新UI变成了可以更新UI,整个异步消息处理的核心思想也就是如此。4.什么是进程内服务?请编程加以说明。在同一个进程下调用的服务,(通常情况下)即在一个应用程序下的服务。Service的启动有两种方式:context.startService()和context.bindService()。新建一个MyService继承自Service,并重写父类的onCreate()、onStartCommand()和onDestroy()方法。Service与activity通讯:context.bindService()我们首先创建了一个ServiceConnection的匿名类,在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在Activity与Service建立关联和解除关联的时候调用。bindService()方法接收三个参数,第一个参数就是刚刚构建出的Intent对象,第二个参数是前面创建出的ServiceConnection的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service,这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行。然后如何我们想解除Activity和Service之间的关联怎么办呢?调用一下unbindService()方法就可以了,这也是UnbindService按钮的点击事件里实现的逻辑。..5.什么是跨进程服务?请编程加以说明。通过一个应用程序(客户端)的Activity调用另一个应用程序(服务端)的Service为跨进程服务。由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界。Android提供了AIDL工具来处理这项工作。在Android中,如果需要在不同进程间实现通信,就需要用到AIDL技术去完成。AIDL是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的Java代码,无需自己去写这段繁杂的代码,只需要在需要的时候调用即可,通过这种方式我们就可以完成进程间的通信工作。在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的。因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。我们只是修改了ServiceConnection中的代码。可以看到,这里首先使用了MyAIDLService.Stub.asInterface()方法将传入的IBinder对象传换成了MyAIDLService对象,接下来就可以调用在MyAIDLService.aidl文件中定义的所有接口了。ClientTest中的Activity如果想要和MyService建立关联其实也不难,首先需要将MyAIDLService.aidl文件从ServiceTest项目中拷贝过来,注意要将原有的包路径一起拷贝过来,完成后项目的结构如下图所示:这里先是对MyAIDLService.Stub进行了实现,重写里了toUpperCase()和plus()这两个方法。这两个方法的作用分别是将一个字符串全部转换成大写格式,以及将两个传入的整数进行相加。然后在onBind()方法中将MyAIDLService.Stub的实现返回。这里为什么可以这样写呢?因为Stub其实就是Binder的子类,所以在onBind()方法中可以直接返回Stub的实现。我们实现了IPerson.Stub这个抽象类的hello方法,然后再onBind(Intent)方法中返回我们的stub实例,这样一来调用方获取的IPerson.Stub就是我们的这个实例,hello方法也会按照我们的期望那样执行。我们要重写ServiceConnection中的onServiceConnected方法将IBinder类型的对象转换成我们的IPerson类型。我们再通过服务端Service定义的“android.intent.action.AIDLService”这个标识符来绑定我们所需要的服务,这样客户端和服务端就实现了通信的连接,我们就可以调用IPerson中的hello方法了。使用了MyAIDLService.Stub.asInterface()方法将传入的IBinder对象传换成了MyAIDLService对象,接下来就可以调用在MyAIDLService.aidl文件中定义的所有接口了。IPerson接口中的抽象内部类Stub继承android.os.Binder类并实现IPerson接口,其中比较重要的方法是asInterface(IBinder)方法,该方法会将IBinder类型的对象转换成IPerson类型,必要的时候生成一个代理对象返回结果。6.如何发送广播?请编程加以说明。因此新建一个MyBroadcastReceiver继承自BroadcastReceiver,代码如下所示:publicclassMyBroadcastReceiverextendsBroadcastReceiver{..@OverridepublicvoidonReceive(Contextcontext,Intentintent){Toast.makeText(context,receivedinMyBroadcastReceiver,Toast.LENGTH_SHORT).show();}}然后在AndroidManifest.xml中对这个广播接收器进行注册然后修改MainActivity中的代码,如下所示:publicclassMainActivityextendsActivity{……@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonbutton=(Button)findViewById(R.id.button);button.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(com.example.broadcasttest.MY_BROADCAST);sendBroadcast(intent);}});……}……}可以看到,我们在按钮的点击事件里面加入了发送自定义广播的逻辑。首先构建出了一个Intent对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去,这样所有监听com.example.broadcasttest.MY_BROADCAST这条广播的广播接收器就会收到消息。此时发出去的广播就是一条标准广播。7.如何接收系统广播消息?请编程加以说明。其实只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑就可以在这个方法中处理。registerReceiver(BroadcastReceiver,intentFilter);--oncreate()unregisterReceiver(BroadcastReceiver);--ondestroy()8.什么是观察者模式?观察者模式的使用场景是怎样的?观察者模式的优缺点是什么?试编程加以说明。定义:定义对象间一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新使用场景:关联行为场景。注意的是,关联行为是可拆分的,而不是组合关系。..事件多级触发场景跨系统的消息交换场景,如消息队列的处理机制优点:观察者和被观察这之间是抽象耦合的建立一套触发机制缺点:需要考虑下开发效率和运行效率9.什么是装饰模式?装饰模式的使用场景是怎样的?装饰模式的优缺点是什么?试编程加以说明。装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。装饰器模式的应用场景:(1)需要扩展一个类的功能。(2)动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)缺点:产生过多相似的对象,不易排错。优点:装饰类和被装饰类可以独立发展,而不会互相耦合装饰模式是继承关系的一个替代方案装饰模式可以动态地扩展为一个实现类的功能10.Executor、ExecutorService和Executors的区别是什么?Executor是一个简单的标准化接口,用于定义类似于线程的自定义子系统,包括线程池、异步IO和轻量级任务框架。根据所使用的具体Executor类的不同,可能在新创建的线程中,现有的任务执行线程中,或者调用execute()的线程中执行任务,并且可能顺序或并发执行。ExecutorService提供了多个完整的异步任务执行框架。ExecutorService管理任务的排队和安排,并允许受控制的关闭。Executors类提供大多数Executor的常见类型和配置的工厂方法,以及使用它们的几种实用工具方法Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。ExecutorService继承Executor。Executors类为创建ExecutorService提供了便捷的工厂方法。11.为什么说Executors类为创建ExecutorSer
本文标题:苏州大学Android【韩冬】期末复习
链接地址:https://www.777doc.com/doc-6069148 .html