較新的Android面試題

最近從成都來深圳了。目前在深圳這邊找工作讶舰。作為一個(gè)Android開發(fā)者,來深圳這邊找工作給我的感覺就是好難√纾可能是市場(chǎng)的原因般甲,隨著Android技術(shù)的成熟,各大培訓(xùn)機(jī)構(gòu)的加入鹅颊,給市場(chǎng)帶來了不小的沖擊敷存。面試官所問的問題也越來越有難度。
在這邊也面試了幾家公司了堪伍,發(fā)現(xiàn)面試的問題很多都跟實(shí)際開發(fā)是兩碼事兒锚烦。是得準(zhǔn)備一下才行,不然在這邊都找不到工作了帝雇。 這兩天搜羅了一些面試題涮俄,做了一下整理。這些東西可以給準(zhǔn)備做Android的萌新一些參考尸闸。各位大牛就看個(gè)樂呵禽拔,其中有不對(duì)的地方忘指出。

正文:

最新整理面試題

1.簡(jiǎn)述synchronized,object,Monitor機(jī)制.

synchronized主要是用來進(jìn)行同步操作室叉,能幫助我們?cè)O(shè)計(jì)更安全的多線程程序。

1)當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的synchronized同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行硫惕。另一個(gè)線程只能等到當(dāng)前線程執(zhí)行完這個(gè)代碼塊才能執(zhí)行該代碼塊茧痕。
2)當(dāng)一個(gè)線程訪問object的一個(gè)synchronized同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized同步代碼塊的訪問將被阻塞恼除。
3)一個(gè)線程訪問object中的synchronized代碼塊時(shí)踪旷,另外一個(gè)線程仍然可以訪問object中的其它代碼。

  • 對(duì)于普通的方法同步豁辉,鎖是當(dāng)前實(shí)例對(duì)象令野。
  • 對(duì)于靜態(tài)方法同步,鎖是當(dāng)前類的class對(duì)象徽级。
  • 對(duì)于方法塊同步气破,鎖是synchronized括號(hào)里的對(duì)象。

monitor是一個(gè)同步工具餐抢,相當(dāng)于操作系統(tǒng)中的互斥量现使。它內(nèi)置于每一個(gè)object對(duì)象中,相當(dāng)于一個(gè)許可證旷痕。拿到許可證即可以進(jìn)行操作碳锈,沒有拿到需要阻塞等待。
使用synchronized時(shí)欺抗,其實(shí)是通過鎖對(duì)象的monitor的取用與釋放來實(shí)現(xiàn)的售碳。

2.簡(jiǎn)述happen-before規(guī)則。

happen-before其實(shí)就是一個(gè)保證而已,它保證一套語句對(duì)內(nèi)存的寫操作對(duì)于另一條語句是可見的贸人。

規(guī)則

1)程序順序規(guī)則:一個(gè)線程中的每個(gè)操作间景,happen-befor于該線程中的任意后續(xù)操作。
2)監(jiān)視鎖規(guī)則:對(duì)一個(gè)監(jiān)視器鎖的解鎖灸姊,happen-before于隨后對(duì)這個(gè)監(jiān)視器鎖的加鎖拱燃。
3)volatileb變量規(guī)則:對(duì)于一個(gè)volatile域的寫,happen-before于任意后續(xù)對(duì)這個(gè)volatile域的讀力惯。
4)傳遞性:如果A happen-before B 碗誉,且B happen-before C,那么A happen-before C父晶。

3.簡(jiǎn)述AQS哮缺。

AQS全稱為(Abstract Queued Synchronizer),這個(gè)類是在java.util.concurrent.locks下面甲喝。
AQS的核心思想是尝苇,如果被請(qǐng)求的共享資源空閑,則將當(dāng)前請(qǐng)求資源的線程設(shè)置為有效的工作線程埠胖,并且將共享資源設(shè)置為鎖定狀態(tài)糠溜。如果被請(qǐng)求的共享資源被占用,那么就需要一套線程阻塞等待以及被喚醒時(shí)鎖分配的機(jī)制直撤,這個(gè)就是AQS機(jī)制非竿。

4.jvm運(yùn)行時(shí)數(shù)據(jù)區(qū)域有哪幾部分組成,各自作用谋竖。

jvm運(yùn)行時(shí)數(shù)據(jù)區(qū)通常包括:程序計(jì)數(shù)器(Program Counter Register),Java棧(VM Stack),本地方法棧(Native Method Stack),方法區(qū)(Method Area)红柱,堆(Heap)。
作用:

  • 棧: 棧中存放的是一個(gè)個(gè)的棧幀蓖乘,每個(gè)棧幀對(duì)應(yīng)一個(gè)被調(diào)用的方法锤悄,在棧幀中包括局部變量表,操作數(shù)棧嘉抒,指向當(dāng)前方法所屬的類的運(yùn)行時(shí)常量池的引用零聚,方法返回地址和一些額外的附加信息。當(dāng)線程執(zhí)行一個(gè)方法時(shí)些侍,就會(huì)隨之創(chuàng)建一個(gè)對(duì)應(yīng)的棧幀必定位于java棧的頂部握牧。

  • 堆:在java中堆是用來存儲(chǔ)對(duì)象本身的以及數(shù)組(數(shù)組引用是存放在java棧中的),在java中程序員不用去關(guān)心空間釋放的問題娩梨,java的垃圾回收機(jī)制會(huì)自動(dòng)進(jìn)行處理沿腰。因此這部分空間也是java垃圾收集管理的主要區(qū)域。堆是被所有線程共享的狈定,在jvm中只有一個(gè)堆颂龙。

  • 方法區(qū):方法區(qū)在jvm中也是一個(gè)非常重要的區(qū)域习蓬,它與堆一樣,是被線程共享的區(qū)域措嵌。在方法區(qū)中躲叼,存儲(chǔ)了每個(gè)類的信息(包括類的名稱,方法信息企巢,字段信息)枫慷,靜態(tài)變量,常量以及編譯器編譯后的代碼等浪规。還有一項(xiàng)信息是常量池或听,用來存儲(chǔ)編譯期間生成的字面量和符號(hào)引用。

  • 本地方法棧:為使用到的本地操作系統(tǒng)方法服務(wù)笋婿。

  • 程序計(jì)數(shù)器:一塊較小的內(nèi)存空間誉裆,它是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。字節(jié)碼解釋器工作時(shí)通過改變?cè)撚?jì)數(shù)器的值來選擇下一條要執(zhí)行的字節(jié)碼指令缸濒。分支足丢,跳轉(zhuǎn),循環(huán)等功能都依靠它來實(shí)現(xiàn)庇配。每條線程都有一個(gè)獨(dú)立的計(jì)數(shù)器斩跌,它們之間互不影響,因此該區(qū)域是線程私有的捞慌。

5.gc算法有哪些滔驶,gc收集器有哪些

gc是java的垃圾回收機(jī)制

  • 引用計(jì)數(shù)法(Reference Counting Collector):使用計(jì)數(shù)器來區(qū)分存活對(duì)象和不再使用的對(duì)象。一般來說卿闹,堆中的每個(gè)對(duì)象對(duì)應(yīng)一個(gè)引用計(jì)數(shù)器。當(dāng)每一次創(chuàng)建一個(gè)對(duì)象并賦給一個(gè)變量時(shí)萝快,引用計(jì)數(shù)器置為1锻霎。當(dāng)對(duì)象被賦給任意變量時(shí),引用計(jì)數(shù)器每次加1當(dāng)對(duì)象出了作用域后(該對(duì)象丟棄不再使用)揪漩,引用計(jì)數(shù)器減1旋恼,一旦引用計(jì)數(shù)器為0,對(duì)象就滿足了垃圾收集的條件奄容。
  • 標(biāo)記算法(Tracing Collector):使用了根集的概念冰更,基于tracing算法的垃圾收集器從根集開始掃描,識(shí)別出哪些對(duì)象可達(dá)昂勒,哪些對(duì)象不可達(dá)蜀细,并用某種方式標(biāo)記可達(dá)對(duì)象。
  • 整理算法(Compacting Collecotr):該算法會(huì)將所有的對(duì)象移到堆的一端戈盈。能解決堆碎片的問題奠衔。
  • 復(fù)制算法:將內(nèi)存分為兩個(gè)區(qū)域(from space 和 to space)谆刨。所有的對(duì)象都分配到from space。清理時(shí)先將所有標(biāo)為活動(dòng)對(duì)象copy到to space归斤,然后清除from space空間痊夭。然后互換from space和to apce的身份,每次清理都重復(fù)上述過程脏里。

gc收集器:

  • serial收集器:?jiǎn)尉€程她我,工作時(shí)必須暫停其他工作線程,多用于client機(jī)器上迫横,使用復(fù)制算法番舆。
  • ParNew收集器:serial的多線程版本,server模式下jvm首選的新生代收集器员淫。復(fù)制算法合蔽。
  • Parallel Scavenge收集器:可控制吞吐量的收集器,吞吐量指有效運(yùn)行時(shí)間介返。復(fù)制算法拴事。
  • Serial Old收集器:serial的老年代版本,使用整理算法圣蝎。
  • Parallel Old收集器:Parallel Scavenge收集器的老版本刃宵,多線程,標(biāo)記整理徘公。
  • CMS收集器:整理算法牲证。最短回收停頓時(shí)間,缺點(diǎn)是產(chǎn)生碎片关面。
  • GI收集器:基本思想是化整為零坦袍,將堆分為多個(gè)Region,優(yōu)先回收價(jià)值最大的Region等太。并行并發(fā)捂齐,分代收集,空間整合缩抡。整理算法奠宜。

6.簡(jiǎn)述class加載各階段,Class Loader有哪些模型瞻想。

在java應(yīng)用程序開發(fā)中压真,只有被jvm裝載的class類型才能在程序中使用。只要生成的字節(jié)碼符合jvm指令集和文件格式蘑险,就可以在jvm上運(yùn)行滴肿,這為java的跨平臺(tái)性提供條件。
字節(jié)碼的裝載過程分為3個(gè)階段:加載佃迄,連接嘴高,初始化竿音。其中連接包括3個(gè)步驟(驗(yàn)證,準(zhǔn)備拴驮,解析)春瞬。
1)加載:處于class裝載的第一個(gè)階段,這時(shí)jvm必須完成通過類的全面獲取類的二進(jìn)制數(shù)據(jù)流套啤,解析類的二進(jìn)制數(shù)據(jù)流為方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)宽气,創(chuàng)建java.lang.Class的實(shí)例。

2)連接:

  • 驗(yàn)證:驗(yàn)證字節(jié)碼文件潜沦,保證加載的字節(jié)碼是符合規(guī)范的萄涯。
  • 準(zhǔn)備:正式為類變量(static修飾的變量)分配內(nèi)存,并設(shè)置內(nèi)變量的初始值唆鸡,這些內(nèi)存都將在方法區(qū)進(jìn)行分配(不包括實(shí)例變量)株汉。
  • 解析:將類贮尖,接口鬼廓,方法和字段的應(yīng)用轉(zhuǎn)為直接引用闷袒。

3)初始化:如果前面的步驟都沒有出現(xiàn)問題,那么表示類可以順利的裝載到系統(tǒng)中臂痕。這個(gè)時(shí)候才會(huì)執(zhí)行java字節(jié)碼伯襟。初始化階段的主要工作是執(zhí)行類的初始化方法。

Class Loader是一個(gè)對(duì)象握童,主要是對(duì)類的請(qǐng)求提供服務(wù)姆怪,當(dāng)jvm需要某個(gè)類是它根據(jù)名稱向ClassLoader請(qǐng)求這個(gè)類,然后ClassLoader返回這個(gè)類的class對(duì)象澡绩。
1)引導(dǎo)類加載器(Bootstrap Class Loader):它用來加載java的核心庫稽揭,使用源生代碼來實(shí)現(xiàn)的。
2)擴(kuò)展類加載器(Extensions Class Loader):用來加載java的擴(kuò)展庫肥卡。jvm的實(shí)現(xiàn)會(huì)提供一個(gè)擴(kuò)展庫目錄溪掀,該類加載器在目錄中尋找并加載java類。
3)系統(tǒng)類加載器(System Class Loader):一般來講召调,java應(yīng)用的類都是由它加載完成的,是根據(jù)java的應(yīng)用類路徑來加載java類蛮浑。

7.簡(jiǎn)述常用的JDK命令行以及工具唠叛。

jak常用工具在安裝目錄的bin目錄下。
工具

--編譯工具:javac
--運(yùn)行工具:java
--壓縮工具:jar
--文檔生成工具:javadoc
--字符編碼轉(zhuǎn)換工具:native2ascii

命令
1沮稚,編譯命令
編譯一個(gè)文件:在目錄下面輸入javac a.java(java文件名),編譯多個(gè)文件中間用空格隔開艺沼;javac -d cls a.java是講編譯的文件放到同目錄的cls文件夾中。
2蕴掏,運(yùn)行命令
java my.hello運(yùn)行my包下面的hello編譯文件障般。
java -calsspath cl my.java
3调鲸,壓縮命令
jar -cvf:壓縮 //jar -cvf hello.jar a.class b.class c.class
jar -xvf:解壓 //jar -xvf cl\hello.jar 解壓cl目錄下的hello.jar
4,文檔生成工具 (將源文件中的doc幫助文件生成HTML文檔)
javadoc hello.java
javadoc -d java\doc -version -author lcz\src\lcz.java
5.字符編碼轉(zhuǎn)換工具
native2ascii -encoding 編碼 源文件名字 改變后的名字

8.簡(jiǎn)述字節(jié)碼文件的組成

1,Class字節(jié)碼中有兩種數(shù)據(jù)類型:
字節(jié)數(shù)據(jù)直接量:這是基本的數(shù)據(jù)類型挽荡。共細(xì)分為u1藐石、u2、u4定拟、u8四種于微,分別代表連續(xù)的1個(gè)字節(jié)、2個(gè)字節(jié)青自、4個(gè)字節(jié)株依、8個(gè)字節(jié)組成的整體數(shù)據(jù)
表:是有多個(gè)基本數(shù)據(jù)或者其它表,按照規(guī)定順序組成的大的數(shù)據(jù)集合延窜。
2恋腕, 具體詳解請(qǐng)參考http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html (我也不懂 ,自己去看大神寫的)逆瑞。

9荠藤,如何實(shí)現(xiàn)一個(gè)定時(shí)調(diào)度和循環(huán)調(diào)度。

1呆万,使用Timer: Timer myTimer = new Timer(); myTimer.schedule(new Worker()商源,1000);//1秒后執(zhí)行谋减。
myTimer.scheduleAtFixedRate(new Worker(),5000,1000);//5秒后執(zhí)行第一次牡彻,之后每隔1秒執(zhí)行一次。

10,多線程出爹,如何實(shí)現(xiàn)一個(gè)ThreadLoacl庄吼。

ThreadLoacl,線程安全類严就。關(guān)于線程安全除了synchronized關(guān)鍵字总寻,還有另一種方法就是ThreadLoacl,它通過為每個(gè)線程提供一個(gè)獨(dú)立的變量副本梢为,解決了變量并發(fā)訪問的沖突問題渐行。ThreadLocal比直接使用synchronized更方便,簡(jiǎn)單并且結(jié)果程序擁有更高的并發(fā)性铸董。
java代碼

1.private static final ThreadLocal threadSession = new ThreadLocal();    
2.    
3.public static Session getSession() throws InfrastructureException {    
4.    Session s = (Session) threadSession.get();    
5.    try {    
6.        if (s == null) {    
7.            s = getSessionFactory().openSession();    
8.            threadSession.set(s);    
9.        }    
10.    } catch (HibernateException ex) {    
11.        throw new InfrastructureException(ex);    
12.    }    
13.    return s;    
14.}   

可以看到在getSession()方法中祟印,首先判斷當(dāng)前線程中有沒有放進(jìn)去session,如果還沒有粟害,那么通過sessionFactory().openSession()來創(chuàng)建一個(gè)session蕴忆,再將session set到線程中,實(shí)際是放到當(dāng)前線程的ThreadLocalMap這個(gè)map中悲幅,這時(shí)套鹅,對(duì)于這個(gè)session的唯一引用就是當(dāng)前線程中的那個(gè)ThreadLocalMap站蝠,而threadSession作為這個(gè)值的key,要取得這個(gè)session可以通過threadSession.get()來得到卓鹿,里面執(zhí)行的操作實(shí)際是先取得當(dāng)前線程中的ThreadLocalMap菱魔,然后將threadSession作為key將對(duì)應(yīng)的值取出。

11减牺,說說你了解的一個(gè)線程安全隊(duì)列豌习。

分為BlockingQueQue(阻塞隊(duì)列)和 ConcurrentLinkedQueQue(非阻塞隊(duì)列)。
以BlockingQueQue為例拔疚,BlockingQueQue作為線程容器肥隆,可以為線程同步提供有力的保障。
BlockingQueQue有兩種實(shí)現(xiàn):
1)基于數(shù)組的阻塞隊(duì)列實(shí)現(xiàn)ArrayBlockingQueQue稚失,內(nèi)部維護(hù)了一個(gè)定長數(shù)組栋艳,以便緩存隊(duì)列中的數(shù)據(jù)對(duì)象。
2)基于鏈表的阻塞隊(duì)列LinkedBlockingAQueQue句各,它內(nèi)部維護(hù)了一個(gè)鏈表結(jié)構(gòu)的數(shù)據(jù)緩沖隊(duì)列吸占。
BlockingQueQue按照FIFO(先進(jìn)先出)排列元素。
注意:1凿宾,必須要使用take()方法在獲取時(shí)達(dá)成阻塞結(jié)果矾屯。
2,使用poll()方法將產(chǎn)生非阻塞效果初厚。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;



public class BlockingDeque {
//阻塞隊(duì)列件蚕,F(xiàn)IFO
private static LinkedBlockingQueue<Integer> concurrentLinkedQueue = new LinkedBlockingQueue<Integer>(); 

      
public static void main(String[] args) {  
 ExecutorService executorService = Executors.newFixedThreadPool(2);  

 executorService.submit(new Producer("producer1"));  
 executorService.submit(new Producer("producer2"));  
 executorService.submit(new Producer("producer3"));  
 executorService.submit(new Consumer("consumer1"));  
 executorService.submit(new Consumer("consumer2"));  
 executorService.submit(new Consumer("consumer3"));  

}  

static class Producer implements Runnable {  
 private String name;  

 public Producer(String name) {  
     this.name = name;  
 }  

 public void run() {  
     for (int i = 1; i < 10; ++i) {  
         System.out.println(name+ "  生產(chǎn): " + i);  
         //concurrentLinkedQueue.add(i);  
         try {
            concurrentLinkedQueue.put(i);
            Thread.sleep(200); //模擬慢速的生產(chǎn),產(chǎn)生阻塞的效果
         } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
         }
         
        }  
     }  
 }  

static class Consumer implements Runnable {  
 private String name;  

 public Consumer(String name) {  
     this.name = name;  
 }  
 public void run() {  
     for (int i = 1; i < 10; ++i) {  
         try {          
                //必須要使用take()方法在獲取的時(shí)候阻塞
                  System.out.println(name+"消費(fèi): " +  concurrentLinkedQueue.take());  
                  //使用poll()方法 將產(chǎn)生非阻塞效果
                  //System.out.println(name+"消費(fèi): " +  concurrentLinkedQueue.poll());  
                 
                 //還有一個(gè)超時(shí)的用法产禾,隊(duì)列空時(shí)排作,指定阻塞時(shí)間后返回,不會(huì)一直阻塞
                 //但有一個(gè)疑問亚情,既然可以不阻塞妄痪,為啥還叫阻塞隊(duì)列?
                //System.out.println(name+" Consumer " +  concurrentLinkedQueue.poll(300, TimeUnit.MILLISECONDS));                    
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }  

     }  
    }  
 }  
}

Android基礎(chǔ)面試題

1楞件,什么是ANR,如何避免它衫生。

在Android設(shè)備上,如果你的應(yīng)用程序有一段時(shí)間響應(yīng)不夠靈敏土浸,當(dāng)響應(yīng)停頓的事件達(dá)到一定的值罪针,系統(tǒng)會(huì)向用戶顯示一個(gè)對(duì)話框,這個(gè)對(duì)話框叫做應(yīng)用程序無響應(yīng)(Application Not Responding)對(duì)話框栅迄,用戶可以選擇讓程序停止或者繼續(xù)運(yùn)行站故。不同的組件發(fā)生ANR的時(shí)間不一樣皆怕,主線程是5s(Activity毅舆,Service)西篓,BroadCastReceiver是10秒。
解決方法:
將所有的耗時(shí)操作憋活,比如訪問網(wǎng)絡(luò)岂津,Socket通信,查詢悦即,復(fù)雜邏輯運(yùn)算等都放到子線程中去執(zhí)行吮成,讓后通過handler.sendMessage,runonUIThread,AsyncTask等方式更新UI,確保用戶操作界面的流暢度辜梳。如果耗時(shí)操作需要用戶等待粱甫,可以在界面上顯示進(jìn)度條。

2作瞄,View的繪制流程茶宵。

View的繪制是從ViewRoot的performTraversals()方法開始的,經(jīng)過measure宗挥,layout乌庶,draw這個(gè)3大步驟。

measure的過程:

measure過程是對(duì)整個(gè)view樹的所有控件計(jì)算寬高
measure是沖ViewRoot類中的host.measure開始的契耿,內(nèi)部調(diào)用的是View的measure(int widthMeasureSpec,int heightMeasureSpec)方法瞒大,measure方法里面調(diào)用了onMeasure(int widthMeasureSpec,int heightMeasureSpec)方法,方法中的兩個(gè)參數(shù)都是是MeasureSpec類型(指父控件對(duì)子控件寬高的期望值搪桂,它是一個(gè)32位的int類型數(shù)透敌,前兩位表示測(cè)量模式,后30位表示測(cè)量大泄亍)
測(cè)量模式一共有3種:
1)EXACTLY 精確測(cè)量模式拙泽,xml文件中寫200dp,march_parent等代表使用該模式裸燎,
2)AT_MOST 最大模式顾瞻,xml文件中寫wrap_content表示使用該模式。
3)UNSPECIFIED 無限大測(cè)量模式德绿,只有在繪制特定自定義View時(shí)才用的到這個(gè)模式荷荤。
真正代表測(cè)量結(jié)束的方法是setMeasuredDimension方法,該方法傳入的兩個(gè)參數(shù)是寬高的SpecSize移稳。測(cè)量結(jié)束后我們可以通過getMeasureHeight和getMeasureWidth來獲取測(cè)量寬高蕴纳。
自定義ViewGroup一定要重寫onMeasure方法,用于測(cè)量子View的寬高个粱,不重寫的話子View沒有寬高古毛。
自定義View如果在xml中使用了wrap_content屬性,就需要重寫onMeasure方法來設(shè)置wrap_content的默認(rèn)大小,不然會(huì)顯示出match_parent的效果稻薇。

layout的過程:

ViewGroup用來將子View放在合適的位置上嫂冻。
layout是從ViewRoot類中的host.layout開始的,內(nèi)部調(diào)用的是ViewGroup的layout方法塞椎。在ViewGroup的layout方法中桨仿,先調(diào)用setFrame來確定自己的左上右下的位置,再調(diào)用onLayout來確定子View的位置案狠。
自定義ViewGroup一定要重寫layout方法來確定子View的位置服傍,自定義View一般不需要重寫該方法,它的位置是右父控件確定的骂铁。

draw過程:

此過程是真正將內(nèi)容展示在屏幕上讓我們能夠看到的過程吹零。
draw是從ViewRoot類中的host.draw開始的,內(nèi)部調(diào)用的是View的draw方法拉庵。
draw的步驟:
1)繪制背景瘪校。
2)繪制內(nèi)容,也就是調(diào)用onDraw方法名段。
3)繪制子View阱扬,調(diào)用的是dispatchDraw方法。
4)繪制裝飾伸辟,如listview的滾動(dòng)條等麻惶。

對(duì)于View的繪制過程,既可以說是簡(jiǎn)單的信夫,也可以說是復(fù)雜的窃蹋,簡(jiǎn)單的在于Google已經(jīng)幫我們將draw框架寫好了,我們?cè)谧远xViewGroup時(shí)不用管draw過程静稻,只需要實(shí)現(xiàn)measure和layout過程警没。復(fù)雜在于,我們寫繼承View的自定義控件的時(shí)候需要重寫onDraw方法振湾,這樣才能繪制出你自定義的View的內(nèi)容杀迹,onDraw(Canvas canvas)方法中最重要的兩個(gè)東西是Paint和Canvas,這個(gè)使用起來算是比較復(fù)雜的押搪。

3树酪,自定義View如何考慮機(jī)型適配

這里要考慮的是屏幕的問題:

  • 合理使用warp_content,match_parent.
  • 盡可能的是使用RelativeLayout
  • 針對(duì)不同的機(jī)型大州,使用不同的布局文件放在對(duì)應(yīng)的目錄下续语,android會(huì)自動(dòng)匹配。
  • 盡量使用點(diǎn)9圖片厦画。
  • 使用與密度無關(guān)的像素單位dp疮茄,sp
  • 引入android的百分比布局。
  • 切圖的時(shí)候切大分辨率的圖,應(yīng)用到布局當(dāng)中力试。在小分辨率的手機(jī)上也會(huì)有很好的顯示效果焚虱。

4,Touch事件分發(fā)機(jī)制

一個(gè)完整的touch事件懂版,由一個(gè)down事件,多個(gè)move事件躏率,一個(gè)up事件組成躯畴。
Touch事件的一般傳遞流程Activity-->window(唯一實(shí)現(xiàn)類PhoneWindow)-->頂級(jí)View(DecorView)-->ViewGroup-->View
監(jiān)聽Touch事件有兩種方式,setOnTouchListener和直接重寫三個(gè)方法:dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent薇芝。
使用setOnTouchListenre方式設(shè)置監(jiān)聽事件蓬抄,該方式的優(yōu)先級(jí)較高,如果在onTouchListener的onTouch方法中return true的話夯到,那么onTouchEvent方法是接收不到該Touch事件的嚷缭。而且因?yàn)閛nClickListener中的onClick方法實(shí)際上是在onTouchEvent中被調(diào)用的,所以Touch事件走不到onTouchEvent耍贾,Touch事件就不會(huì)生效阅爽。

直接重寫三個(gè)方法:
dispatchTouchEvent:該方法是對(duì)點(diǎn)擊事件的分發(fā),在這個(gè)方法中我們一般return super.dispatchTouchEvent,講該事件分發(fā)下去荐开。
onInterceptTouchEvent:該方法表示對(duì)Touch事件進(jìn)行攔截付翁,這是ViewGroup特有的方法,View沒有晃听。在ViewGroup中如果onInterceptTouchEvent返回true百侧,表示將該事件攔截,那么事件將傳遞給ViewGroup的onTouchEvent方法處理能扒。如果onInterceptTouchEvent方法返回true佣渴,事件將傳遞個(gè)子View的dispatchTouchEvent進(jìn)行分發(fā)。
onTouchEvent:該方法表示對(duì)Touch事件進(jìn)行消費(fèi)初斑,返回true表現(xiàn)消費(fèi)辛润,返回false表示不消費(fèi),那么該事件該事件將傳遞給父控件的onTouchEvent處理见秤。

5频蛔,Art和Dalvik的區(qū)別

在程序運(yùn)行過程中Dalvik虛擬機(jī)不斷的進(jìn)行將字節(jié)碼轉(zhuǎn)換為機(jī)器碼的工作。
而Art引入了AOT這種預(yù)編譯技術(shù)秦叛,在應(yīng)用程序的安裝過程中已經(jīng)將所有的字節(jié)碼編譯為了機(jī)器碼晦溪,在運(yùn)行的時(shí)候直接調(diào)用。Art極大的提高了程序的運(yùn)行效率挣跋,同時(shí)減少了手機(jī)的耗電量三圆,在垃圾回收機(jī)制上也有很大的優(yōu)化,但是Art模式下應(yīng)用程序的安裝需要消耗更多的時(shí)間,同時(shí)也需要跟多的安裝空間舟肉。
Dalvik 是Android4.4及以下平臺(tái)的虛擬機(jī)修噪。
Art 是在Android4.4以上平臺(tái)使用的虛擬機(jī)。

6路媚,ddms和traceView的區(qū)別

1黄琼, ddms:是android開發(fā)環(huán)境中的dalvik虛擬機(jī)調(diào)試監(jiān)控服務(wù);
ddms能夠提供整慎,測(cè)試設(shè)備截屏脏款,針對(duì)特定的進(jìn)程查看正在運(yùn)行的線程以及堆信息,Logcat裤园,廣播狀態(tài)信息撤师,模擬電話呼叫,接收sms拧揽,虛擬地理坐標(biāo)等剃盾。
2,traceView是android平臺(tái)配備的性能分析的工具淤袜;它可以通過圖形化讓我們了解要跟蹤的程序的性能痒谴,并且能具體到方法。
區(qū)別:ddms是一個(gè)程序執(zhí)行查看器铡羡,在里面可以看見線程和堆棧等信息闰歪,traceView是程序性能分析器。

7蓖墅,四大組件及生命周期库倘。

1)Activity:常用的生命周期方法有 ;
onCreat->onStart->onResume->onPuase->onStop->onDestroy
當(dāng)已經(jīng)存在的Activity由不可見到可見會(huì)走onRestart方法论矾。
意外銷毀時(shí)會(huì)走onSaveInstanceState方法結(jié)束教翩,由意外銷毀恢復(fù)是會(huì)走onRestoreInstanceState方法。
2)BroadcastReceive:在接收到廣播是執(zhí)行onReceive方法在該方法返回結(jié)果后結(jié)束贪壳,如果在onReceive中做了超過10s的事情就會(huì)報(bào)ANR饱亿。
3)Service:

  • 當(dāng)start一個(gè)Service時(shí)的生命周期方法:
    onCreate->onStart->onDestroy
  • 當(dāng)bind一個(gè)Serive時(shí)的生命周期方法:
    onCreate->onBind->onUnbind->onDestroy
    4)ContentProvider:在Android平臺(tái)上多個(gè)應(yīng)用程序共享數(shù)據(jù)時(shí)會(huì)用到。 在訪問ContentProvider的時(shí)候闰靴,可以通過Activity或者Context的getContentPresolver來訪問彪笼。每一個(gè)ContentProvider都有一個(gè)唯一的URI來識(shí)別。
    其中的方法有:query蚂且,insert配猫,update,delete杏死;
    ContentProvider在接收到ContentResolver發(fā)出的請(qǐng)求后被激活泵肄,也僅在響應(yīng)ContentResolver提出的請(qǐng)求是激活捆交,我們普遍認(rèn)為它在請(qǐng)求完畢后關(guān)閉。

8腐巢,對(duì)AIDL的理解

AIDL:android interface definition language的縮寫品追。
AIDL是用來實(shí)現(xiàn)進(jìn)程間通信的,可以幫我們實(shí)現(xiàn)發(fā)布以及調(diào)用遠(yuǎn)程服務(wù)冯丙。
使用:
1)服務(wù)端:創(chuàng)建一個(gè)Service用來監(jiān)聽客戶端的連接請(qǐng)求肉瓦,然后創(chuàng)建一個(gè)AIDL文件,將服務(wù)端暴露給客戶端的接口在這個(gè)文件中聲明胃惜,最后在Service中實(shí)現(xiàn)這個(gè)AIDL接口泞莉。
2)客戶端:首先綁定服務(wù)端的Service,綁定成功后將服務(wù)端返回的Binder對(duì)象轉(zhuǎn)成AIDL接口所屬的類型蛹疯,接著就可以調(diào)用AIDL中的方法。

9热监,簡(jiǎn)單敘述okhttp的實(shí)現(xiàn)原理

Android中網(wǎng)絡(luò)請(qǐng)求框架比較多捺弦,常用的有HttpURLConnention,Volley,okHttp孝扛,Retrofit列吼,RxJava等,從Android4.4開始HttpURLConnection底層實(shí)現(xiàn)采用的是okhttp苦始。
進(jìn)行通信的原理主要是通過dispatcher不斷從requestQueue中取出請(qǐng)求call寞钥,根據(jù)是否已經(jīng)緩存調(diào)用Cache或NetWork這兩類數(shù)據(jù)獲取接口之一,從內(nèi)存緩存或者服務(wù)器中獲取請(qǐng)求的數(shù)據(jù)陌选。分為同步和異步請(qǐng)求理郑,同步請(qǐng)求通過call.execute()直接返回當(dāng)前的response,而異步請(qǐng)求會(huì)將當(dāng)前的call.enqueue添加到請(qǐng)求隊(duì)列中咨油,通過回調(diào)的方式來獲取最后的結(jié)果您炉。

10,如何保證一個(gè)后臺(tái)服務(wù)不被殺死役电,比較省電的方式是什么赚爵。

Android中通過Service實(shí)現(xiàn)后臺(tái)任務(wù)。
方法一:

通過將Service綁定到Notification法瑟,成為一個(gè)前提服務(wù)冀膝,可以提高存活率在Service中創(chuàng)建一個(gè)Notification,再調(diào)用Service.startForeground(int id,Notification notification)方法運(yùn)行在前臺(tái)即可霎挟。這個(gè)方式使用360等如阿健管家可以殺死窝剖。

方法二:
通過定時(shí)警報(bào)來不斷啟動(dòng)Service,這樣就算Service被殺死酥夭,也能再啟動(dòng)枯芬。同時(shí)也可以監(jiān)聽網(wǎng)絡(luò)切換论笔,開鎖屏等廣播啟動(dòng)Service。
參考:
Intent intent = new Intent(mContext千所,MyService.class)狂魔;
PendingIntent sender = PendingIntent.getService(mContext,0,intent,0);
AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),5*10000,sender);
這種方式不斷啟動(dòng)的邏輯處理起來很麻煩。

方法三:
通過jni調(diào)用c淫痰,在c語音中啟動(dòng)一個(gè)進(jìn)程fork()最楷。 可以保證360等手機(jī)管家不會(huì)清理。但是帶來了jni交互待错,稍微有點(diǎn)麻煩籽孙。

保證一個(gè)后臺(tái)不被殺死的方法還要很多,對(duì)于那種方法比較省電我就不知道了火俄。還需要繼續(xù)學(xué)習(xí)犯建。

11,請(qǐng)介紹一下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的瓜客。

Android提供了ContentProvider适瓦,一個(gè)程序可以通過實(shí)現(xiàn)一個(gè)ContentProvider的抽象接口將自己的數(shù)據(jù)完全暴露出去,而且ContentProvicer是以類似數(shù)據(jù)庫中表的方式將數(shù)據(jù)暴露谱仪。也就是說ContentProvider就像一個(gè)“數(shù)據(jù)庫”玻熙。那么外界獲取其提供的數(shù)據(jù),也就應(yīng)該與從數(shù)據(jù)庫中獲取數(shù)據(jù)的操作基本一樣疯攒,只不過是采用URI來表示外界需要訪問的“數(shù)據(jù)庫”嗦随。外部訪問通過ContentResolver去訪問并操作這些被暴露的數(shù)據(jù)。

12敬尺,Handler機(jī)制枚尼。

Handler包括四個(gè)角色:

  • Handler:負(fù)責(zé)發(fā)送消息處理消息。
  • Message:消息實(shí)體對(duì)象砂吞,handler通過sendMessage將實(shí)體放到消息隊(duì)列中姑原。
  • MessageQueQue:存放消息的隊(duì)列。
  • Looper:消息輪詢器呜舒,不停的從消息隊(duì)列中取出消息交給handler處理锭汛。

在主線程創(chuàng)建Handler,在需要發(fā)送消息的地方創(chuàng)建一個(gè)Message袭蝗,通過handler發(fā)送唤殴。這個(gè)消息回到MessageQueQue中,然后Looper會(huì)將這個(gè)消息取出交給handler處理到腥。

Handler可以有多個(gè)朵逝,但是在同一線程中Looper和MessageQueQue只能有一個(gè)。

13乡范,Binder機(jī)制

Binder包含四個(gè)角色:

  • Server 服務(wù)器
  • Client 客戶終端 配名,獲得實(shí)名Binder的引用啤咽。Server向ServiceManger注冊(cè)了Binder實(shí)體及名字后,Client就可以通過名字獲得該Binder的引用渠脉。例如我們申請(qǐng)獲得名字叫張三的Binder的引用宇整,ServiceManager收到這個(gè)連接請(qǐng)求,從請(qǐng)求數(shù)據(jù)包里獲得Binder的名字芋膘。再找到該名字對(duì)應(yīng)的條目鳞青,從條目中取出Binder的引用。將該引用作為回復(fù)發(fā)送給發(fā)起請(qǐng)求的Client为朋。
  • ServiceManager 域名服務(wù)器(DNS)臂拓,負(fù)責(zé)將字符形式的Binder名字轉(zhuǎn)化成Client中對(duì)該Binder的應(yīng)用,使得Client能通過Binder名字獲得Server中Binder實(shí)體的引用习寸。
  • Binder驅(qū)動(dòng) 可以理解為路由器胶惰。Binder驅(qū)動(dòng)負(fù)責(zé)進(jìn)程之間Binder通信的建立,Binder在進(jìn)程間的傳遞霞溪。

Binder使用Client-Server通信方式孵滞,安全性好,簡(jiǎn)單高效威鹿。再加上其面向?qū)ο蟮脑O(shè)計(jì)思想剃斧,獨(dú)特的接收緩存管理和線程池管理方式轨香,成為Android進(jìn)程間通信的中流砥柱忽你。

14,ListView中圖片錯(cuò)位的原理臂容,和解決方法科雳。

錯(cuò)位原理: 如果我們只是簡(jiǎn)單的顯示數(shù)據(jù),沒有convertView的復(fù)用和異步操作脓杉,就不會(huì)產(chǎn)生圖片錯(cuò)位糟秘。重用convertView但沒有異步操作也不會(huì)有錯(cuò)位現(xiàn)象。例如我們的listView中剛好顯示7個(gè)item球散,當(dāng)向下滑動(dòng)時(shí)尿赚,顯示出item8,而item8是重用的item1蕉堰,如果此時(shí)異步網(wǎng)絡(luò)請(qǐng)求item8的圖片凌净,比item1的圖片慢,那么item8就會(huì)顯示item1的圖片屋讶。當(dāng)item8下載完成冰寻,此時(shí)用戶向上滑顯示item1時(shí),又復(fù)用的item8的image皿渗。這樣就導(dǎo)致的圖片錯(cuò)位斩芭。
解決方法: 對(duì)imageview設(shè)置tag轻腺,并預(yù)設(shè)一張圖片。向下滑動(dòng)后划乖,item8顯示贬养,item1隱藏。但由于item1是第一次進(jìn)來就顯示所以一般情況下迁筛,item1都會(huì)比item8先下載完煤蚌,此時(shí)可見的item8的tag和隱藏了的item1的url不匹配,所以就算item1的圖片下載完也不會(huì)顯示到item8中细卧,因?yàn)閠ag標(biāo)識(shí)的永遠(yuǎn)是可見圖片中的url
holder.img.setTag(imgUrl);
holder.img.setImageResource(R.drawable.ic_launcher);
if(imageView.getTag() != null && imageView.getTag().equals(imageUrl)){ imageView.setImageBitmap(result);}

15,在manifest 和代碼中如何注冊(cè)和使用BroadcastReceiver尉桩;

<receiver android:name="包名.自己擴(kuò)展的廣播接收者名">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

16,ApplicationContext和ActivityContext的區(qū)別;

這是兩種不同的context贪庙,也是最常見的兩種.第一種中context的生命周期與Application的生命周期相關(guān)的蜘犁,context隨著Application的銷毀而銷毀,伴隨application的一生止邮,與activity的生命周期無關(guān).第二種中的context跟Activity的生命周期是相關(guān)的这橙,但是對(duì)一個(gè)Application來說,Activity可以銷毀幾次导披,那么屬于Activity的context就會(huì)銷毀多次.至于用哪種context屈扎,得看應(yīng)用場(chǎng)景,個(gè)人感覺用Activity的context好一點(diǎn)撩匕,不過也有的時(shí)候必須使用Application的context.application context

17,Serializable 和Parcelable 的區(qū)別鹰晨;

在Android上應(yīng)該盡量采用Parcelable,它效率更高止毕。
Parcelabe代碼比Serializable多一些模蜡。
Parcelabe比Serializable速度高十倍以上。
Serializable只需要對(duì)某個(gè)類以及它的屬性實(shí)現(xiàn)Serializable接口即可扁凛,無需實(shí)現(xiàn)方法忍疾。缺點(diǎn)是使用的反射,序列化的過程較慢谨朝,這種機(jī)制會(huì)在序列化的時(shí)候創(chuàng)建許多的臨時(shí)對(duì)象卤妒。容易觸發(fā)GC。
Parcable方法實(shí)現(xiàn)的原理是將一根完整的對(duì)象進(jìn)行分解字币,而分解后的每一部分都是Intent所支持的數(shù)據(jù)類型则披,這樣也就實(shí)現(xiàn)傳遞對(duì)象的功能。

18,介紹一下NDK;

一 : NDK是一系列工具的集合
NDK提供了一系列的工具纬朝,幫助開發(fā)者快速開發(fā)C或C++的動(dòng)態(tài)庫收叶,并能自動(dòng)將so和java應(yīng)用一起打包成apk。這些工具對(duì)開發(fā)者的幫助是巨大的共苛。
NDK集成了交叉編譯器判没,并提供了相應(yīng)的mk文件隔離CPU蜓萄,平臺(tái),ABI等差異澄峰。開發(fā)人員只需要簡(jiǎn)單修改mk文件(指出哪些文件需要編譯嫉沽,編譯特性要求等)就可以創(chuàng)建出so。
NDK可以自動(dòng)將so和java應(yīng)用一起打包俏竞,極大的減輕了開發(fā)人員的打包工作绸硕。
二 : NDK提供了一份穩(wěn)定,功能有限的API頭文件聲明魂毁。
Google明確聲明該API是穩(wěn)定的玻佩,在后續(xù)所有版本中都穩(wěn)定支持當(dāng)前發(fā)布的API。從該版本的NDK中看出席楚,這些API支持的功能非常有限咬崔,包含:c標(biāo)準(zhǔn)庫,標(biāo)準(zhǔn)數(shù)學(xué)庫烦秩,壓縮庫垮斯,Log庫。

19只祠,混合開發(fā)兜蠕;

混合開發(fā)就是在一個(gè)App中內(nèi)嵌一個(gè)輕量級(jí)的瀏覽器,一部分源生的功能改為Html5來開發(fā)抛寝,這部分功能不僅能夠在不升級(jí)App的情況下動(dòng)態(tài)更新熊杨,也可以在Android或者iOS的App上同時(shí)運(yùn)行,讓用戶的體驗(yàn)更好又可以節(jié)省開發(fā)的資源墩剖。
混合開發(fā)最主要的是Html5和Native的交互
在Android中WebView本來就支持js和java相互調(diào)用猴凹,只需要開啟WebView的腳本執(zhí)行夷狰,然后通過mWebView.addJavascriptInterface(new JsBridge(),"bxbxbai");向Html5頁面注入一股Java對(duì)象岭皂,然后就可以在Html5頁面中調(diào)用Native的功能了。
Android4.2以后的系統(tǒng)規(guī)定允許被js調(diào)用的Java方法必須以@JavascriptInterface進(jìn)行注解沼头。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末爷绘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子进倍,更是在濱河造成了極大的恐慌土至,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猾昆,死亡現(xiàn)場(chǎng)離奇詭異陶因,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)垂蜗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門楷扬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來解幽,“玉大人,你說我怎么就攤上這事烘苹《阒辏” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵镣衡,是天一觀的道長霜定。 經(jīng)常有香客問我,道長廊鸥,這世上最難降的妖魔是什么望浩? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮惰说,結(jié)果婚禮上曾雕,老公的妹妹穿的比我還像新娘。我一直安慰自己助被,他們只是感情好剖张,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揩环,像睡著了一般搔弄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丰滑,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天顾犹,我揣著相機(jī)與錄音,去河邊找鬼褒墨。 笑死炫刷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郁妈。 我是一名探鬼主播浑玛,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼噩咪!你這毒婦竟也來了顾彰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤胃碾,失蹤者是張志新(化名)和其女友劉穎涨享,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仆百,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厕隧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吁讨。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帖族,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挡爵,到底是詐尸還是另有隱情竖般,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布茶鹃,位于F島的核電站涣雕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏闭翩。R本人自食惡果不足惜挣郭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疗韵。 院中可真熱鬧兑障,春花似錦、人聲如沸蕉汪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽者疤。三九已至福澡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驹马,已是汗流浹背革砸。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糯累,地道東北人算利。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像泳姐,于是被迫代替她去往敵國和親效拭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評(píng)論 25 707
  • Java中的String類可以被繼承么仗岸? 答:不能允耿,因?yàn)樗且粋€(gè)final類借笙,同樣的還有Integer扒怖,F(xiàn)loat...
    gyymz1993閱讀 3,996評(píng)論 2 104
  • java 接口的意義-百度 規(guī)范、擴(kuò)展业稼、回調(diào) 抽象類的意義-樂視 為其子類提供一個(gè)公共的類型封裝子類中得重復(fù)內(nèi)容定...
    交流電1582閱讀 2,242評(píng)論 0 11
  • 我希望一生里的時(shí)辰里盗痒, 總是平常的。 所有的事情, 都是普普通通的俯邓。 就像每天的 穿衣 吃飯 工作骡楼。 但也會(huì)...
    之舒閱讀 275評(píng)論 0 2
  • 框架: 構(gòu)造函數(shù): 繼承中的訪問控制: 不允許重載的符號(hào): 成員指針與成員函數(shù)指針: const的限定: 類中靜態(tài)...
    fo0Old閱讀 304評(píng)論 0 2