android面试

阅读更多
  1. 笔试,共10道题,不限时间。(答案整理自互联网,不保证完全正确,仅供参考。)  
  2. 1.请谈一下Android系统的架构。  
  3. 答:Android系统采用了分层架构,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。  
  4. 2.谈谈android大众常用的五种布局。  
  5. 答:在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。  
  6. (1)FrameLayout 框架布局,放入其中的所有元素都被放置在最左上的区域,而且无法为这些元素指定一个确切的位置,下一个子元素会重叠覆盖上一个子元素,适合浏览单张图片。  
  7. (2)LinearLayout 线性布局,是应用程序中最常用的布局方式,主要提供控件水平或者垂直排列的模型,每个子组件都是以垂直或水平的方式来定位.(默认是垂直)  
  8. (3)AbsoluteLayout 绝对定位布局,采用坐标轴的方式定位组件,左上角是(0,0)点,往右x轴递增,往下Y轴递增,组件定位属性为android:layout_x 和 android:layout_y来确定坐标。  
  9. (4)RelativeLayout 相对布局,根据另外一个组件或是顶层父组件来确定下一个组件的位置。和CSS里面的类似。  
  10. (5)TableLayout 表格布局,类似Html里的Table.使用TableRow来布局,其中TableRow代表一行,TableRow的每一个视图组件代表一个单元格。  
  11. 3.谈谈android数据存储方式。  
  12. 答:Android提供了5种方式存储数据:  
  13. (1)使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。  
  14. (2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。  
  15. (3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。  
  16. (4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。  
  17. (5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。  
  18. 4.Android中Activity, Intent, Content Provider, Service各有什么区别。  
  19. 答:Activity: 活动,是最基本的android应用程序组件。一个活动就是一个单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。  
  20. Intent: 意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。  
  21. Content Provider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。  
  22. Service:服务,具有一段较长生命周期且没有用户界面的程序。  
  23. 5.View, surfaceView, GLSurfaceView有什么区别。  
  24. 答:view是最基础的,必须在UI主线程内更新画面,速度较慢。  
  25. SurfaceView 是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快  
  26. GLSurfaceView 是SurfaceView的子类,opengl 专用的  
  27. 6.Adapter有什么作用?常见的Adapter有哪些?  
  28. 答:Adapter 是连接后端数据和前端显示的适配器接口。常见的Adapter有 ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter 等  
  29. 7.Manifest.xml文件中主要包括哪些信息?  
  30. 答:manifest:根节点,描述了package中所有的内容。  
  31. uses-permission:请求你的package正常运作所需赋予的安全许可。  
  32. permission: 声明了安全许可来限制哪些程序能你package中的组件和功能。  
  33. instrumentation:声明了用来测试此package或其他package指令组件的代码。  
  34. application:包含package中application级别组件声明的根节点。  
  35. activity:Activity是用来与用户交互的主要工具。  
  36. receiver:IntentReceiver能使的application获得数据的改变或者发生的操作,即使它当前不在运行。  
  37. service:Service是能在后台运行任意时间的组件。  
  38. provider:ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。  
  39. 8.请写一段代码(SAX, DOM, 或者pull )来解析XML文档。  
  40. 答:下面是要解析的XML文件:  
  41.   
  42. "1.0"  encoding= "UTF-8" ?>  
  43.   
  44. "1" >  
  45. 张三  
  46. 22  
  47.   
  48. "2" >  
  49. 李四  
  50. 23  
  51.   
  52.   
  53.   
  54. 复制代码  
  55. 定义一个名为Person的javaBean用于存放上面解析出来的xml内容  
  56.   
  57. public   class  Person {  
  58. private  Integer id;  
  59. private  String name;  
  60. private  Short age;  
  61.   
  62. public  Integer getId() {  
  63. return  id;  
  64. }  
  65.   
  66. public   void  setId(Integer id) {  
  67. this .id = id;  
  68. }  
  69.   
  70. public  String getName() {  
  71. return  name;  
  72. }  
  73.   
  74. public   void  setName(String name) {  
  75. this .name = name;  
  76. }  
  77.   
  78. public  Short getAge() {  
  79. return  age;  
  80. }  
  81.   
  82. public   void  setAge(Short age) {  
  83. this .age = age;  
  84. }  
  85. @Override  
  86.     public  String toString() {  
  87.         return   "id=" +id+ ",name=" +name+ ",age=" +age;  
  88.     }  
  89.   
  90. }  
  91.   
  92. package com.leo.service;  
  93.   
  94. import java.io.InputStream;  
  95. import java.util.List;  
  96.   
  97. import javax.xml.parsers.SAXParser;  
  98. import javax.xml.parsers.SAXParserFactory;  
  99.   
  100. import com.leo.domain.Person;  
  101.   
  102. public   class  SAXPersonService {  
  103.     public   static  List readXml(InputStream inStream) throws Exception {  
  104.         
  105.             SAXParserFactory spf = SAXParserFactory.newInstance();  
  106.             SAXParser saxParser = spf.newSAXParser(); //创建解析器          
  107.             PersonDefaultHandler handler = new  PersonDefaultHandler();  
  108.             saxParser.parse(inStream, handler);  
  109.             inStream.close();  
  110.             return  handler.getPersons();          
  111.     }  
  112. }  
  113.   
  114. 复制代码  
  115. (1)使用SAX读取XML文件;它采用的是事件驱动,并不需要解析完整个文档,速度快并且占用内存少。需要为SAX提供实现ContentHandler接口的类。  
  116. PersonDefaultHandler.java  
  117.   
  118. import java.util.ArrayList;  
  119. import java.util.List;  
  120.   
  121. import org.xml.sax.Attributes;  
  122. import org.xml.sax.SAXException;  
  123. import org.xml.sax.helpers.DefaultHandler;  
  124.   
  125. import com.sinber.domain.Person;  
  126.   
  127. public   class  PersonDefaultHandler extends DefaultHandler {  
  128. private  List persons;  
  129. private  Person person ;  //记录当前person   
  130. private  String perTag;  //记录前一个标签的名称   
  131.   
  132. /**  
  133. * 重写父类的开始文档方法。用于初始化  
  134. */   
  135. @Override  
  136. public   void  startDocument() throws SAXException {  
  137. persons = new  ArrayList();  
  138. }  
  139.   
  140. @Override  
  141. public   void  startElement(String uri, String localName, String qName,  
  142. Attributes attributes) throws SAXException {  
  143. if ( "person" .equals(localName)){  
  144. Integer id = new  Integer(attributes.getValue(0));  //取id   
  145. person = new  Person();  
  146. person.setId(id);  
  147. }  
  148. perTag = localName;  
  149. }  
  150.   
  151. /**参数:  
  152. * ch 整个XML字符串  
  153. * start 节点值在整个XML字符串中的索引位置  
  154. * length 节点值的长度  
  155. */   
  156. @Override  
  157. public   void  characters( char [] ch,  int  start,  int  length)  
  158. throws SAXException {  
  159. if (perTag!=null){  
  160. String data = new  String(ch,start,length);  
  161. if ( "name" .equals(perTag)){  
  162. person.setName(data);  
  163. }else   if ( "age" .equals(perTag)){  
  164. person.setAge(new  Short(data));  
  165. }  
  166. }  
  167. }  
  168.   
  169. @Override  
  170. public   void  endElement(String uri, String localName, String qName)  
  171. throws SAXException {  
  172. if ( "person" .equals(localName)){  
  173. persons.add(person);  
  174. person = null;  
  175. }  
  176. perTag = null;  
  177. }  
  178.   
  179. public  List getPersons() {  
  180. return  persons;  
  181. }  
  182. }  
  183.   
  184. 复制代码  
  185. SAXPerson.java  
  186.   
  187. import java.io.InputStream;  
  188. import java.util.List;  
  189. import javax.xml.parsers.SAXParser;  
  190. import javax.xml.parsers.SAXParserFactory;  
  191. import com.sinber.domain.Person;  
  192. public   class  SAXPerson{  
  193. public   static  List getPerson() throws Exception{  
  194. //通过类装载器获取文件   
  195. InputStream inStream = SAXPersonService.class .getClassLoader().getResourceAsStream( "person.xml" );  
  196. SAXParserFactory factory = SAXParserFactory.newInstance();  
  197. SAXParser saxParser = factory.newSAXParser();  
  198. PersonDefaultHandler handler = new  PersonDefaultHandler();  
  199. saxParser.parse(inStream, handler);  
  200. inStream.close();  
  201.   
  202. return  handler.getPersons();  
  203. }  
  204. }  
  205.   
  206. package com.leo.xml;  
  207.   
  208. import java.io.InputStream;  
  209. import java.util.List;  
  210.   
  211. import android.test.AndroidTestCase;  
  212. import android.util.Log;  
  213.   
  214. import com.leo.domain.Person;  
  215. import com.leo.service.SAXPersonService;  
  216.   
  217. public   class  SAXPersonServiceTest extends AndroidTestCase {  
  218.     private   static  final String TAG =  "SAXPersonServiceTest" ;  
  219.     /*使用SAX解析xml*/   
  220.     public   void  testReadXml() throws Exception{  
  221.         InputStream inStream = SAXPersonServiceTest.class .getClassLoader().getResourceAsStream( "leo.xml" );  
  222.         List persons = SAXPersonService.readXml(inStream);  
  223.           
  224.         for ( Person person : persons){  
  225.             Log.i(TAG, person.toString());  
  226.         }  
  227.     }  
  228. /*使用DOM解析xml内容,适合于解析比较小的xml内容*/   
  229.     public   void  testDOMReadXml() throws Exception{  
  230.         InputStream inStream = XmlPersonServiceTest.class .getClassLoader().getResourceAsStream( "leo.xml" );  
  231.         List persons = DOMPersonService.readXml(inStream);  
  232.           
  233.         for ( Person person : persons){  
  234.             Log.i(TAG, person.toString());  
  235.         }  
  236.     }  
  237. }  
  238. public   class  XMLActivity extends Activity {  
  239.     private   static  final String TAG =  "XMLActivity" ;  
  240.     @Override  
  241.     public   void  onCreate(Bundle savedInstanceState) {  
  242.         super.onCreate(savedInstanceState);  
  243.         setContentView(R.layout.main);  
  244.         TextView resultView = (TextView)this .findViewById(R.id.result);  
  245.           
  246.         InputStream inStream = XMLActivity.class .getClassLoader().getResourceAsStream( "leo.xml" );  
  247.           
  248.         try  {  
  249.             List persons = SAXPersonService.readXml(inStream);  
  250.             StringBuilder sb = new  StringBuilder();  
  251.                   
  252.             for (Person person : persons){  
  253.                 sb.append(person.toString()).append("\n" );  
  254.             }  
  255.             resultView.setText(sb.toString());  
  256.         } catch  (Exception e) {  
  257.             Log.e(TAG, e.toString());  
  258.             Toast.makeText(this "XML解析失败" , Toast.LENGTH_LONG).show();  
  259.         }          
  260.          
  261.     }  
  262. }  
  263.   
  264.   
  265. 复制代码  
  266. (2)DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。  
  267. DOMPerson.java  
  268.   
  269. import java.io.InputStream;  
  270. import java.util.ArrayList;  
  271. import java.util.List;  
  272.   
  273. import javax.xml.parsers.DocumentBuilder;  
  274. import javax.xml.parsers.DocumentBuilderFactory;  
  275. import org.w3c.dom.Document;  
  276. import org.w3c.dom.Element;  
  277. import org.w3c.dom.Node;  
  278. import org.w3c.dom.NodeList;  
  279. import com.sinber.domain.Person;  
  280. public   class  DOMPerson {  
  281. public   static  List getPerson() throws Exception{  
  282. List pers = new  ArrayList();  
  283. InputStream inStream = SAXPersonService.class .getClassLoader().getResourceAsStream( "person.xml" );  
  284. DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();  
  285. DocumentBuilder builder = factory.newDocumentBuilder();  
  286. Document dom = builder.parse(inStream);  
  287. Element root = dom.getDocumentElement();  
  288. NodeList persons = root.getElementsByTagName("person" );  
  289. for ( int  i=0;i
  290. Element personNode =(Element)persons.item(i);  
  291. Person person = new  Person();  
  292. person.setId(new  Integer(personNode.getAttribute( "id" )));  
  293. NodeList childNodes = personNode.getChildNodes();  
  294. for ( int  j=0;j
  295. Node childNode = childNodes.item(j);  
  296. if (childNode.getNodeType()==Node.ELEMENT_NODE){  
  297. Element element = (Element)childNode;  
  298. if ( "name" .equals(childNode.getNodeName())){  
  299. person.setName(new  String(element.getFirstChild().getNodeValue()));  
  300. }else   if ( "age" .equals(childNode.getNodeName())){  
  301. person.setAge(new  Short(element.getFirstChild().getNodeValue()));  
  302. }  
  303. }  
  304. }  
  305. pers.add(person);  
  306. }  
  307. inStream.close();  
  308. return  pers;  
  309. }  
  310. }  
  311.   
  312. 复制代码  
  313. (3)使用Pull解析器读取XML文件  
  314. PullPerson.java  
  315.   
  316. import java.io.File;  
  317. import java.io.FileOutputStream;  
  318. import java.io.InputStream;  
  319. import java.util.ArrayList;  
  320. import java.util.List;  
  321. import org.xmlpull.v1.XmlPullParser;  
  322. import org.xmlpull.v1.XmlSerializer;  
  323. import android.os.Environment;  
  324. import android.util.Xml;  
  325. import com.sinber.domain.Person;  
  326. public   class  PullPerson {  
  327.   
  328. public   static   void  save(List persons) throws Exception{  
  329. XmlSerializer serializer = Xml.newSerializer();  
  330. File file = new  File(Environment.getExternalStorageDirectory(), "person.xml" );  
  331. FileOutputStream outStream = new  FileOutputStream(file);  
  332. serializer.setOutput(outStream,"UTF-8" );  
  333. serializer.startDocument("UTF-8" true );  
  334. serializer.startTag("" "persons" );  
  335. for (Person person:persons){  
  336. serializer.startTag("" "person" );  //person   
  337. serializer.attribute("" "id" "" +person.getId());  
  338. serializer.startTag("" "name" );  //name   
  339. serializer.text(person.getName());  
  340. serializer.endTag("" "name" );  //name   
  341. serializer.startTag("" "age" );  //age   
  342. serializer.text(person.getAge().toString());  
  343. serializer.endTag("" "age" ); //age   
  344.   
  345. serializer.endTag("" "person" );  //person   
  346. }  
  347. serializer.endTag("" "persons" );  
  348. serializer.endDocument();  
  349. outStream.close();  
  350. }  
  351.   
  352. public   static  List getPersons() throws Exception{  
  353. List persons = null;  
  354. Person person = null;  
  355. XmlPullParser parser= Xml.newPullParser();  
  356. InputStream inStream = PullPersonService.class .getClassLoader().getResourceAsStream( "person.xml" );  
  357. parser.setInput(inStream, "UTF-8" );  
  358. int  eventType = parser.getEventType();  //触发第一个事件   
  359. while (eventType!=XmlPullParser.END_DOCUMENT){  
  360. switch (eventType){  
  361. case  XmlPullParser.START_DOCUMENT:  
  362. persons = new  ArrayList();  
  363. break ;  
  364.   
  365. case  XmlPullParser.START_TAG:  //开始元素事件   
  366. if ( "person" .equals(parser.getName())){  
  367. person = new  Person();  
  368. person.setId(new  Integer(parser.getAttributeValue(0)));  
  369. }else   if (person!=null){  
  370. if ( "name" .equals(parser.getName())){  
  371. person.setName(parser.nextText());  
  372. }else   if ( "age" .equals(parser.getName())){  
  373. person.setAge(new  Short(parser.nextText()));  
  374. }  
  375. }  
  376. break ;  
  377.   
  378. case  XmlPullParser.END_TAG:  //结束元素事件   
  379. if ( "person" .equals(parser.getName())){  
  380. persons.add(person);  
  381. person = null;  
  382. }  
  383. break ;  
  384.   
  385. default :  
  386. break ;  
  387. }  
  388. eventType = parser.next();  
  389. }  
  390. return  persons;  
  391. }  
  392. }  
  393.   
  394. 复制代码  
  395. 以上三种方式任选其一即可。  
  396. 9.根据自己的理解描述下Android数字签名。  
  397. 答:(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序  
  398. (2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证  
  399. (3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。  
  400. (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。  
  401. 10.已知单链表的头结构head,写一个函数把这个链表逆序。  
  402. 答: 如下所示  
  403. Node.java  
  404.   
  405. public   class  Node {  
  406. private  Integer count;  
  407. private  Node nextNode;  
  408.   
  409. public  Node(){  
  410.   
  411. }  
  412. public  Node( int  count){  
  413. this .count =  new  Integer(count);  
  414. }  
  415. public  Integer getCount() {  
  416. return  count;  
  417. }  
  418. public   void  setCount(Integer count) {  
  419. this .count = count;  
  420. }  
  421. public  Node getNextNode() {  
  422. return  nextNode;  
  423. }  
  424. public   void  setNextNode(Node nextNode) {  
  425. this .nextNode = nextNode;  
  426. }  
  427.   
  428. }  
  429.   
  430. 复制代码  
  431. ReverseSingleLink.java  
  432.   
  433. public   class  ReverseSingleLink {  
  434. public   static  Node revSingleLink(Node head){  
  435. if (head == null){  //链表为空不能逆序   
  436. return  head;  
  437. }  
  438. if (head.getNextNode()==null){  //如果只有一个结点,当然逆过来也是同一个   
  439. return  head;  
  440. }  
  441. Node rhead = revSingleLink(head.getNextNode());  
  442. head.getNextNode().setNextNode(head);  
  443. head.setNextNode(null);  
  444. return  rhead;  
  445. }  
  446. public   static   void  main(String[] args){  
  447. Node head = new  Node(0);  
  448. Node temp1 = null,temp2 = null;  
  449. for ( int  i=1;i<100;i++){  
  450. temp1 = new  Node(i);  
  451. if (i==1){  
  452. head.setNextNode(temp1);  
  453. }else {  
  454. temp2.setNextNode(temp1);  
  455. }  
  456. temp2 = temp1;  
  457. }  
  458. head = revSingleLink(head);  
  459. while (head!=null){  
  460. head = head.getNextNode();  
  461. }  

  462. }

你可能感兴趣的:(android,面试,android面试)