注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

是缘是情是童真

如果你用笑脸面对 你会看见别人的笑脸

 
 
 

日志

 
 

android 一些题目整理(三)  

2011-06-25 13:45:41|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

16. 请介绍下ContentProvider是如何实现数据共享的。

一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。

如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
 
参考:http://www.moandroid.com/?p=319

  17. 如何启用Service,如何停用Service

1.第一种是通过调用Context.startService()启动,调用Context.stopService()结束,startService()可以传递参数给Service

2
.第二种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,还可以通过ServiceConnection访问Service

Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreateonBindonUnbindonDestory在一个生命周期中只能被调用一次。

参考:http://www.cnblogs.com/feisky/archive/2010/06/14/1758336.html

  18. 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。

android中,不同进程之间传递信息要用到广播,可以有两种方式来实现。
第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。
具体实现在Manifestapplication中添加:
<receiver android:name=".mEvtReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
上面两个android:name分别是广播名和广播的动作(这里的动作是表示系统启动完成),如果要自己发送一个广播,在代码中为:
Intent i = new Intent("android.intent.action.BOOT_COMPLETED");
sendBroadcast(i);
这样,广播就发出去了,然后是接收。
接收可以新建一个类,继承至BroadcastReceiver,也可以建一个BroadcastReceiver的实例,然后得写onReceive方法,实现如下:
protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("android.intent.action.BOOT_COMPLETED")) {
//Do something 
}
} 
};

第二种方式,直接在代码中实现,但需要手动注册注销,实现如下:
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.BOOT_COMPLETED");
registerReceiver(mEvtReceiver, filter); //
这时注册了一个recevier ,名为mEvtReceiver,然后同样用上面的方法以重写onReceiver
最后在程序的onDestroy中要注销广播,实现如下:
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mPlayerEvtReceiver);
}

Android系统中的广播是广泛用于应用程序之间通信的一种手段,它类似于事件处理机制,不同的地方就是广播的处理是系统级别的事件处理过程(一般事件处理是控件级别的)。在此过程中仍然是离不开Intent对象,理解广播事件的处理过程,灵活运用广播处理机制,在关键之处往往能实现特别的效果,

Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。
使用广播必须要有一个intent 对象必设置其action动作对象
使用广播必须在配置文件中显式的指明该广播对象
每次接收广播都会重新生成一个接收广播的对象
BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理

转自:http://www.dengdeng.name/u/deng/archives/2010/92.html

         http://www.cnblogs.com/TerryBlog/archive/2010/08/16/1801016.html

  19. 请解释下在单线程模型中MessageHandlerMessage QueueLooper之间的关系。

简单的说,Handler获取当前线程中的looper对象,looper用来从存放MessageMessageQueue中取出Message,再有Handler进行Message的分发和处理

参见:http://hi.baidu.com/%C1%F7%C0?%BB%D0%DD/blog/item/4e576b7c58d742360cd7dac9.html

         http://blog.csdn.net/xuxinyl/archive/2010/12/25/6097560.aspx

  20. AIDL的全称是什么?如何工作?能处理哪些类型的数据?

AIDL全称Android Interface Definition LanguageAndRoid接口描述语言) 是一种借口描述语言编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDLIPC的机制和COMCORBA类似是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.理论上参数可以传递基本数据类型和String, 还有就是Bundle的派生类不过在Eclipse,目前的ADT不支持Bundle做为参数,

具体实现步骤如下:

1
、创建AIDL文件在这个文件里面定义接口该接口定义了可供客户端访问的方法和属性。


2
、编译AIDL文件Ant的话可能需要手动使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译不需要人为介入.

3
、在Java文件中实现AIDL中定义的接口编译器会根据AIDL接口产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.

4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。

5、在服务器端回调客户端的函数前提是当客户端获取的IBinder接口的时候,要去注册回调函数只有这样服务器端才知道该调用那些函数


AIDL
语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

1. 
不需要import声明的简单Java编程语言类型(int,boolean)

2. String, CharSequence
不需要特殊声明 

3. List, Map
Parcelables类型这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型. 

(
另外我没尝试Parcelables, Eclipse+ADT下编译不过或许以后会有所支持).


实现接口时有几个原则:

.
抛出的异常不要返回给调用者跨进程抛异常处理是不可取的.

.IPC
调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。 也就是IPC调用会挂起应用程序导致界面失去响应这种情况应该考虑单起一个线程来处理.

.
不能在AIDL接口中声明静态属性。

IPC
的调用步骤:

1. 
声明一个接口类型的变量,该接口类型在.aidl文件中定义。

2. 
实现ServiceConnection

3. 
调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递. 

4. 
ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用

YourInterfaceName.Stub.asInterface((IBinder)service)
将参数转换为YourInterface类型。

5. 
调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。

6. 
断开连接,调用接口实例中的ApplicationContext.unbindService()

参考:http://buaadallas.blog.51cto.com/399160/372090

21. 请解释下Android程序运行时权限与文件系统权限的区别。

apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。

android系统有的权限是基于签名的。

具体参见:http://blog.csdn.net/Zengyangtech/archive/2010/07/20/5749999.aspx

  22. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

     通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性

  23. 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%

  24、什么是ANR 如何避免它?

  答:ANRApplication Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:

  对输入事件(如按键、触摸屏事件)的响应超过5

  意向接受器(intentReceiver)超过10秒钟仍未执行完毕

  Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)

  因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate() onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成 (或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 -- 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程 在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序 对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时 问题。

  25、什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

  答:一般像空指针啊,可以看起logcat,然后对应到程序中 来解决错误

  26Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?

  27、简要解释一下activity intent intent filterserviceBroadcaseBroadcaseReceiver

  答:一个activity呈现了一个用户可以操作的可视化用户界面

  一个service不包含可见的用户界面,而是在后台无限地运行

  可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信

  一个broadcast receiver是一个接收广播消息并作出回应的componentbroadcast receiver没有界面

  intent:content provider在接收到ContentResolver的请求时被激活。

  activity, servicebroadcast receiver是被称为intents的异步消息激活的。

一个intent是一个Intent对象,它保存了消息的内容。对于activityservice来说,它指定了请求的操作名称和待操作数据的URI

  Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于 manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component

  它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个componentintent filter告诉androidcomponent能处理的intentintent filter也是在manifest文件中声明的。

  28IntentService有何优点?

  答:IntentService 的好处

  * Acitivity的进程,当处理Intent的时候,会产生一个对应的Service

  * Android的进程处理器现在会尽可能的不kill掉你

  * 非常容易使用

  29、横竖屏切换时候activity的生命周期?

  1、不设置Activityandroid:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

  2、设置Activityandroid:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

  3、设置Activityandroid:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

  30. 如何将SQLite数据库(dictionary.db文件)apk文件一起发布?

  解答:可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中

  评论这张
 
阅读(587)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018