• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

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

            public Integer getId() {
            return id;
            }

            publicvoid setId(Integer id) {
            this.id = id;
            }

            public String getName() {
            return name;
            }

            publicvoid setName(String name) {
            this.name = name;
            }

            public Short getAge() {
            return age;
            }

            publicvoid setAge(Short age) {
            this.age = age;
            }
            }
             (1)使用SAX讀取XML文件;它采用的是事件驅(qū)動(dòng),并不需要解析完整個(gè)文檔,速度快并且占用內(nèi)存少。需要為SAX提供實(shí)現(xiàn)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;

            publicclass PersonDefaultHandler extends DefaultHandler {
            private List<Person> persons;
            private Person person ; //記錄當(dāng)前person
            private String perTag; //記錄前一個(gè)標(biāo)簽的名稱

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

            @Override
            publicvoid 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;
            }

            /**參數(shù):
            * ch 整個(gè)XML字符串
            * start 節(jié)點(diǎn)值在整個(gè)XML字符串中的索引位置
            * length 節(jié)點(diǎn)值的長(zhǎng)度
            */
            @Override
            publicvoid 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);
            }
            elseif("age".equals(perTag)){
            person.setAge(
            new Short(data));
            }
            }
            }

            @Override
            publicvoid 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;
            publicclass SAXPerson{
            publicstatic List<Person> getPerson() throws Exception{
            //通過(guò)類裝載器獲取文件
            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文件時(shí),會(huì)將XML文件的所有內(nèi)容讀取到內(nèi)存中,然后允許您使用DOM API遍歷XML樹(shù)、檢索所需的數(shù)據(jù)。
            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;
            publicclass DOMPerson {
            publicstatic 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()));
            }
            elseif("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;
            publicclass PullPerson {

            publicstaticvoid 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();
            }

            publicstatic 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(); //觸發(fā)第一個(gè)事件
            while(eventType!=XmlPullParser.END_DOCUMENT){
            switch(eventType){
            case XmlPullParser.START_DOCUMENT:
            persons
            =new ArrayList<Person>();
            break;

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

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

            default:
            break;
            }
            eventType
            = parser.next();
            }
            return persons;
            }
            }
            以上三種方式任選其一即可。
             
            9.根據(jù)自己的理解描述下Android數(shù)字簽名。
             答:(1)所有的應(yīng)用程序都必須有數(shù)字證書(shū),Android系統(tǒng)不會(huì)安裝一個(gè)沒(méi)有數(shù)字證書(shū)的應(yīng)用程序
            (2)Android程序包使用的數(shù)字證書(shū)可以是自簽名的,不需要一個(gè)權(quán)威的數(shù)字證書(shū)機(jī)構(gòu)簽名認(rèn)證
            (3)如果要正式發(fā)布一個(gè)Android ,必須使用一個(gè)合適的私鑰生成的數(shù)字證書(shū)來(lái)給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書(shū)來(lái)發(fā)布。
            (4)數(shù)字證書(shū)都是有有效期的,Android只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書(shū)的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書(shū)過(guò)期也不會(huì)影響程序的正常功能。
             
             
            10.已知單鏈表的頭結(jié)構(gòu)head,寫(xiě)一個(gè)函數(shù)把這個(gè)鏈表逆序。
            答: 如下所示
            Node.java
            publicclass Node {
            private Integer count;
            private Node nextNode;

            public Node(){

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

            }
            ReverseSingleLink.java
            publicclass ReverseSingleLink {
            publicstatic Node revSingleLink(Node head){
            if(head ==null){ //鏈表為空不能逆序
            return head;
            }
            if(head.getNextNode()==null){ //如果只有一個(gè)結(jié)點(diǎn),當(dāng)然逆過(guò)來(lái)也是同一個(gè)
            return head;
            }
            Node rhead
            = revSingleLink(head.getNextNode());
            head.getNextNode().setNextNode(head);
            head.setNextNode(
            null);
            return rhead;
            }
            publicstaticvoid 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();
            }
            }
            }
            posted on 2012-02-21 15:43 life02 閱讀(243) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 筆試
            久久亚洲日韩看片无码| 国产精品久久久久久久久久影院| 精品久久久久久国产三级| 亚洲伊人久久精品影院| 久久99精品国产麻豆宅宅| 国内精品久久国产大陆| 国产亚洲精久久久久久无码AV| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久久WWW成人免费毛片| 久久亚洲精品无码观看不卡| 久久AV高清无码| 久久激情亚洲精品无码?V| 精品久久久无码人妻中文字幕豆芽 | 日韩精品国产自在久久现线拍 | 国产精品美女久久久久| 精品久久久久久国产牛牛app| 久久婷婷午色综合夜啪| 99久久成人国产精品免费 | 久久久久无码精品国产| 国产一区二区久久久| 66精品综合久久久久久久| 久久天天躁狠狠躁夜夜avapp| 久久成人精品| 久久最近最新中文字幕大全 | 精品午夜久久福利大片| 久久天天躁狠狠躁夜夜躁2014| 99热热久久这里只有精品68| 久久久久人妻精品一区| 99久久无色码中文字幕人妻 | 久久AV高潮AV无码AV| 亚洲&#228;v永久无码精品天堂久久 | 久久久久国产| 久久精品成人欧美大片| 久久国产精品成人免费| 精品999久久久久久中文字幕| 久久久久亚洲av无码专区喷水| 久久亚洲sm情趣捆绑调教| 国产精品一区二区久久精品涩爱 | 亚洲精品乱码久久久久久久久久久久 | 日韩欧美亚洲国产精品字幕久久久| 四虎国产永久免费久久|