夢想飛翔

          自強不息
          posts - 111, comments - 30, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Android筆試總結

          Posted on 2011-05-29 23:47 love1563 閱讀(2653) 評論(0)  編輯  收藏 所屬分類: 項目總結

          Android筆試總結

          筆試,共10道題,不限時間。(答案整理自互聯網,不保證完全正確,僅供參考。)
          1.請談一下Android系統的架構。
          答:Android系統采用了分層架構,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和linux核心層。
           
          2.談談android大眾常用的五種布局。
          答:在Android中,共有五種布局方式,分別是:FrameLayout(框架布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)。
          (1)FrameLayout  框架布局,放入其中的所有元素都被放置在最左上的區域,而且無法為這些元素指定一個確切的位置,下一個子元素會重疊覆蓋上一個子元素,適合瀏覽單張圖片。
          (2)LinearLayout  線性布局,是應用程序中最常用的布局方式,主要提供控件水平或者垂直排列的模型,每個子組件都是以垂直或水平的方式來定位.(默認是垂直)
          (3)AbsoluteLayout 絕對定位布局,采用坐標軸的方式定位組件,左上角是(0,0)點,往右x軸遞增,往下Y軸遞增,組件定位屬性為android:layout_x 和 android:layout_y來確定坐標。
          (4)RelativeLayout 相對布局,根據另外一個組件或是頂層父組件來確定下一個組件的位置。和CSS里面的類似。
          (5)TableLayout 表格布局,類似Html里的Table.使用TableRow來布局,其中TableRow代表一行,TableRow的每一個視圖組件代表一個單元格。
           
          3.談談android數據存儲方式。
          答:Android提供了5種方式存儲數據:
          (1)使用SharedPreferences存儲數據;它是Android提供的用來存儲一些簡單配置信息的一種機制,采用了XML格式將數據存儲到設備中。只能在同一個包內使用,不能在不同的包之間使用。
          (2)文件存儲數據;文件存儲方式是一種較常用的方法,在Android中讀取/寫入文件的方法,與Java中實現I/O的程序是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取設備上的文件。
          (3)SQLite數據庫存儲數據;SQLite是Android所帶的一個標準的數據庫,它支持SQL語句,它是一個輕量級的嵌入式數據庫。
          (4)使用ContentProvider存儲數據;主要用于應用程序之間進行數據交換,從而能夠讓其他的應用保存或讀取此Content Provider的各種數據類型。
          (5)網絡存儲數據;通過網絡上提供給我們的存儲空間來上傳(存儲)和下載(獲取)我們存儲在網絡空間中的數據信息。
           
          4.Android中Activity, Intent, Content Provider, Service各有什么區別。
          答:Activity: 活動,是最基本的android應用程序組件。一個活動就是一個單獨的屏幕,每一個活動都被實現為一個獨立的類,并且從活動基類繼承而來。
          Intent: 意圖,描述應用想干什么。最重要的部分是動作和動作對應的數據。
          Content Provider:內容提供器,android應用程序能夠將它們的數據保存到文件、SQLite數據庫中,甚至是任何有效的設備中。當你想將你的應用數據和其他應用共享時,內容提供器就可以發揮作用了。
          Service:服務,具有一段較長生命周期且沒有用戶界面的程序。
           
          5.View, surfaceView, GLSurfaceView有什么區別。
          答:view是最基礎的,必須在UI主線程內更新畫面,速度較慢。
          SurfaceView 是view的子類,類似使用雙緩機制,在新的線程中更新畫面所以刷新界面速度比view快
          GLSurfaceView 是SurfaceView的子類,opengl 專用的
           
          6.Adapter有什么作用?常見的Adapter有哪些?
          答:Adapter是連接后端數據和前端顯示的適配器接口。常見的Adapter有ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter等
           
          7.Manifest.xml文件中主要包括哪些信息?
          答:manifest:根節點,描述了package中所有的內容。
          uses-permission:請求你的package正常運作所需賦予的安全許可。
          permission: 聲明了安全許可來限制哪些程序能你package中的組件和功能。
          instrumentation:聲明了用來測試此package或其他package指令組件的代碼。
          application:包含package中application級別組件聲明的根節點。
           activity:Activity是用來與用戶交互的主要工具。
           receiver:IntentReceiver能使的application獲得數據的改變或者發生的操作,即使它當前不在運行。
           service:Service是能在后臺運行任意時間的組件。
           provider:ContentProvider是用來管理持久化數據并發布給其他應用程序使用的組件。
           
          8.請寫一段代碼(SAX, DOM, 或者pull )來解析XML文檔。
          答:下面是要解析的XML文件:
          <?xml version="1.0" encoding="UTF-8"?>
          <persons>
          <person id="1">
          <name>張三</name>
          <age>22</age>
          </person>
          <person id="2">
          <name>李四</name>
          <age>23</age>
          </person>
          </persons>
          定義一個名為Person的javaBean用于存放上面解析出來的xml內容
          public class Person {
          private Integer id;
          private String name;
          private Short age;

          public Integer getId() {
          return id;
          }

          public void setId(Integer id) {
          this.id = id;
          }

          public String getName() {
          return name;
          }

          public void setName(String name) {
          this.name = name;
          }

          public Short getAge() {
          return age;
          }

          public void setAge(Short age) {
          this.age = age;
          }
          }
           (1)使用SAX讀取XML文件;它采用的是事件驅動,并不需要解析完整個文檔,速度快并且占用內存少。需要為SAX提供實現ContentHandler接口的類。
          PersonDefaultHandler.java
          import java.util.ArrayList;
          import java.util.List;

          import org.xml.sax.Attributes;
          import org.xml.sax.SAXException;
          import org.xml.sax.helpers.DefaultHandler;

          import com.sinber.domain.Person;

          public class PersonDefaultHandler extends DefaultHandler {
          private List<Person> persons;
          private Person person ; //記錄當前person
          private String perTag; //記錄前一個標簽的名稱

          /**
          * 重寫父類的開始文檔方法。用于初始化
          */
          @Override
          public void startDocument() throws SAXException {
          persons
          = new ArrayList<Person>();
          }

          @Override
          public void startElement(String uri, String localName, String qName,
          Attributes attributes)
          throws SAXException {
          if("person".equals(localName)){
          Integer id
          = new Integer(attributes.getValue(0)); //取id
          person = new Person();
          person.setId(id);
          }
          perTag
          = localName;
          }

          /**參數:
          * ch 整個XML字符串
          * start 節點值在整個XML字符串中的索引位置
          * length 節點值的長度
          */
          @Override
          public void characters(char[] ch, int start, int length)
          throws SAXException {
          if(perTag!=null){
          String data
          = new String(ch,start,length);
          if("name".equals(perTag)){
          person.setName(data);
          }
          else if("age".equals(perTag)){
          person.setAge(
          new Short(data));
          }
          }
          }

          @Override
          public void endElement(String uri, String localName, String qName)
          throws SAXException {
          if("person".equals(localName)){
          persons.add(person);
          person
          = null;
          }
          perTag
          = null;
          }

          public List<Person> getPersons() {
          return persons;
          }
          }
          SAXPerson.java
          import java.io.InputStream;
          import java.util.List;
          import javax.xml.parsers.SAXParser;
          import javax.xml.parsers.SAXParserFactory;
          import com.sinber.domain.Person;
          public class SAXPerson{
          public static List<Person> getPerson() throws Exception{
          //通過類裝載器獲取文件
          InputStream inStream = SAXPersonService.class.getClassLoader().getResourceAsStream("person.xml");
          SAXParserFactory factory
          = SAXParserFactory.newInstance();
          SAXParser saxParser
          = factory.newSAXParser();
          PersonDefaultHandler handler
          = new PersonDefaultHandler();
          saxParser.parse(inStream, handler);
          inStream.close();

          return handler.getPersons();
          }
          }
           
          (2)DOM解析XML文件時,會將XML文件的所有內容讀取到內存中,然后允許您使用DOM API遍歷XML樹、檢索所需的數據。
          DOMPerson.java
           
          import java.io.InputStream;
          import java.util.ArrayList;
          import java.util.List;

          import javax.xml.parsers.DocumentBuilder;
          import javax.xml.parsers.DocumentBuilderFactory;
          import org.w3c.dom.Document;
          import org.w3c.dom.Element;
          import org.w3c.dom.Node;
          import org.w3c.dom.NodeList;
          import com.sinber.domain.Person;
          public class DOMPerson {
          public static List<Person> getPerson() throws Exception{
          List
          <Person> pers = new ArrayList<Person>();
          InputStream inStream
          = SAXPersonService.class.getClassLoader().getResourceAsStream("person.xml");
          DocumentBuilderFactory factory
          =DocumentBuilderFactory.newInstance();
          DocumentBuilder builder
          = factory.newDocumentBuilder();
          Document dom
          = builder.parse(inStream);
          Element root
          = dom.getDocumentElement();
          NodeList persons
          = root.getElementsByTagName("person");
          for(int i=0;i<persons.getLength();i++){
          Element personNode
          =(Element)persons.item(i);
          Person person
          = new Person();
          person.setId(
          new Integer(personNode.getAttribute("id")));
          NodeList childNodes
          = personNode.getChildNodes();
          for(int j=0;j<childNodes.getLength();j++){
          Node childNode
          = childNodes.item(j);
          if(childNode.getNodeType()==Node.ELEMENT_NODE){
          Element element
          = (Element)childNode;
          if("name".equals(childNode.getNodeName())){
          person.setName(
          new String(element.getFirstChild().getNodeValue()));
          }
          else if("age".equals(childNode.getNodeName())){
          person.setAge(
          new Short(element.getFirstChild().getNodeValue()));
          }
          }
          }
          pers.add(person);
          }
          inStream.close();
          return pers;
          }
          }
          (3)使用Pull解析器讀取XML文件
          PullPerson.java
          import java.io.File;
          import java.io.FileOutputStream;
          import java.io.InputStream;
          import java.util.ArrayList;
          import java.util.List;
          import org.xmlpull.v1.XmlPullParser;
          import org.xmlpull.v1.XmlSerializer;
          import android.os.Environment;
          import android.util.Xml;
          import com.sinber.domain.Person;
          public class PullPerson {

          public static void save(List<Person> persons) throws Exception{
          XmlSerializer serializer
          = Xml.newSerializer();
          File file
          = new File(Environment.getExternalStorageDirectory(),"person.xml");
          FileOutputStream outStream
          = new FileOutputStream(file);
          serializer.setOutput(outStream,
          "UTF-8");
          serializer.startDocument(
          "UTF-8", true);
          serializer.startTag(
          "", "persons");
          for(Person person:persons){
          serializer.startTag(
          "", "person"); //person
          serializer.attribute("", "id", ""+person.getId());
          serializer.startTag(
          "", "name"); //name
          serializer.text(person.getName());
          serializer.endTag(
          "", "name"); //name
          serializer.startTag("", "age"); //age
          serializer.text(person.getAge().toString());
          serializer.endTag(
          "", "age");//age

          serializer.endTag(
          "", "person"); //person
          }
          serializer.endTag(
          "", "persons");
          serializer.endDocument();
          outStream.close();
          }

          public static List<Person> getPersons() throws Exception{
          List
          <Person> persons = null;
          Person person
          = null;
          XmlPullParser parser
          = Xml.newPullParser();
          InputStream inStream
          = PullPersonService.class.getClassLoader().getResourceAsStream("person.xml");
          parser.setInput(inStream,
          "UTF-8");
          int eventType = parser.getEventType(); //觸發第一個事件
          while(eventType!=XmlPullParser.END_DOCUMENT){
          switch(eventType){
          case XmlPullParser.START_DOCUMENT:
          persons
          = new ArrayList<Person>();
          break;

          case XmlPullParser.START_TAG: //開始元素事件
          if("person".equals(parser.getName())){
          person
          = new Person();
          person.setId(
          new Integer(parser.getAttributeValue(0)));
          }
          else if(person!=null){
          if("name".equals(parser.getName())){
          person.setName(parser.nextText());
          }
          else if("age".equals(parser.getName())){
          person.setAge(
          new Short(parser.nextText()));
          }
          }
          break;

          case XmlPullParser.END_TAG: //結束元素事件
          if("person".equals(parser.getName())){
          persons.add(person);
          person
          = null;
          }
          break;

          default:
          break;
          }
          eventType
          = parser.next();
          }
          return persons;
          }
          }
          以上三種方式任選其一即可。
           
          9.根據自己的理解描述下Android數字簽名。
           答:(1)所有的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序
          (2)Android程序包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證
          (3)如果要正式發布一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。
          (4)數字證書都是有有效期的,Android只是在應用程序安裝的時候才會檢查證書的有效期。如果程序已經安裝在系統中,即使證書過期也不會影響程序的正常功能。
          10.已知單鏈表的頭結構head,寫一個函數把這個鏈表逆序。
          答: 如下所示
          Node.java
          public class Node {
          private Integer count;
          private Node nextNode;

          public Node(){

          }
          public Node(int count){
          this.count = new Integer(count);
          }
          public Integer getCount() {
          return count;
          }
          public void setCount(Integer count) {
          this.count = count;
          }
          public Node getNextNode() {
          return nextNode;
          }
          public void setNextNode(Node nextNode) {
          this.nextNode = nextNode;
          }

          }
          ReverseSingleLink.java
          public class ReverseSingleLink {
          public static Node revSingleLink(Node head){
          if(head == null){ //鏈表為空不能逆序
          return head;
          }
          if(head.getNextNode()==null){ //如果只有一個結點,當然逆過來也是同一個
          return head;
          }
          Node rhead
          = revSingleLink(head.getNextNode());
          head.getNextNode().setNextNode(head);
          head.setNextNode(
          null);
          return rhead;
          }
          public static void main(String[] args){
          Node head
          = new Node(0);
          Node temp1
          = null,temp2 = null;
          for(int i=1;i<100;i++){
          temp1
          = new Node(i);
          if(i==1){
          head.setNextNode(temp1);
          }
          else{
          temp2.setNextNode(temp1);
          }
          temp2
          = temp1;
          }
          head
          = revSingleLink(head);
          while(head!=null){
          head = head.getNextNode();
          }
          }
          }
          主站蜘蛛池模板: 波密县| 大埔县| 富源县| 黑龙江省| 宁波市| 榆林市| 介休市| 菏泽市| 河北区| 昌江| 东台市| 枣庄市| 嘉善县| 石楼县| 东城区| 永年县| 本溪| 九寨沟县| 建德市| 平果县| 桦川县| 六枝特区| 怀集县| 丽江市| 乌审旗| 平果县| 资中县| 苏尼特右旗| 油尖旺区| 余江县| 江永县| 日土县| 曲周县| 陇西县| 长治县| 民勤县| 皋兰县| 蒲江县| 乳山市| 大连市| 辽中县|