android面试题之六
三十一、AIDL的全称是什么?如何工作?能处理哪些类型的数据?
英文全称:Android Interface Define Language(Android接口定义语言)。
当A进程要去调用B进程中的service并实现通信时,我们通常都是通过AIDL来操作的。
基本操作步骤:
在A工程中某个目录下(如com.lovo.aidlservice)下创建一个aidl文件(如RemoteService.aidl),在里面自定义一个接口,含有get方法,ADT插件会在gen目录下自动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.stub的内部类,该内部类中含有aidl文件接口的get方法。
自定义一个MyService类继承Service,在MyService类中自定义一个内部类去继承RemoteService.stub这个内部类,实现get方法。在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。
然后需要在配置文件中配置该service(需要指明action参数,以便下面B工程访问)。
将A工程中的RemoteService.java文件拷贝到B工程对应目录,在bindService方法中绑定aidl服务,就是将RemoteService的ID作为intent的action参数。
注意:若我们访问的远程服务属于系统的,比如黑名单挂断电话,这时只需将其aidl拷贝到工程的对应目录下即可。
AIDL既能处理简单类型的数据也能处理复杂类型的数据。
具体示例请参考:http://blog.csdn.net/u010142437/article/details/9273115
三十二、系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。
访问指定页面可以通过Uri 来确定。
对于指定浏览器:
1、默认浏览器:
在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。
Intent intent =new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url =Uri.parse("http://www.163.com");
intent.setData(content_url);
startActivity(intent);
2、指定浏览器:
如果手机本身安装了多个浏览器而又没有设置默认浏览器的话,系统将让用户选择使用哪个浏览器来打开连接。
另外,也可以发送显示Intent来启动浏览器。如下面就是启动Android原生浏览器的例子:
Intent intent =new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url =Uri.parse("http://www.163.com");
intent.setData(content_url);
intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
startActivity(intent);
注:要启动其他浏览器只需修改intent.setClassName()里面的参数就OK了。
常见的浏览器:
uc浏览器":"com.uc.browser", "com.uc.browser.ActivityUpdate“
opera浏览器:"com.opera.mini.android", "com.opera.mini.android.Browser"
qq浏览器:"com.tencent.mtt", "com.tencent.mtt.MainActivity"
三十三、如何退出Activity?如何安全退出已调用多个Activity的Application?
退出单个activity使用finish即可。
退出多个activity的方式有很多种,我经常使用的有以下几种:
1、自定义一个Application子类,里面提供一个集合专门存放所有的activity,另外提供两个方法,一个用来往集合增加activity,另一个用来销毁集合中所有的activity即退出应用程序。这样其他activity启动后就可以添加到该集合中,需要退出应用程序时,调用该Application类的退出程序的方法行了。这种方式易于理解,操作也方便。
2、发送特定广播:当需要结束应用时,发送一个特定的广播,每个activity收到广播后,关闭即可。
3、创建一个专门用来退出应用程序的activity,该activity不包含任何有关业务的操作,当需要结束应用程序时,跳转到该activity,并同时设置intent的flags为Intent.FLAG_ACTIVITY_CLEAR_TOP,这样该activity所在栈上面的所有activity都将销毁,然后销毁那个空白的activity即可。
示例可见:http://blog.csdn.net/u010142437/article/details/9398041
三十四、IntentService 的好处
参考示例:http://blog.csdn.net/u010142437/article/details/12063907
http://blog.csdn.net/u010142437/article/details/12063451
三十五、根据自己的理解描述下Android数字签名
在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限。Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制。Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。
同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。
(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。
(2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。
(3)可以通过权限(permission)的方式在多个程序间共享数据和代码。Android提供了基于数字证书的权限赋予机制,应用程序可以和其他的程序共享概功能或者数据给那那些与自己拥有相同数字证书的程序。如果某个权限(permission)的protectionLevel是signature,则这个权限就只能授予那些跟该权限所在的包拥有同一个数字证书的程序。
在签名时,需要考虑数字证书的有效期:
(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。
(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。
(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。
Android数字证书包含以下几个要点:
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。