找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4326|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

Android 面試精華題目

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:109770 發(fā)表于 2016-3-22 19:48 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
下面的題目都是樓主在android交流群大家面試時(shí)遇到的,如果大家有好的題目或者好的見解歡迎分享,樓主將長期維護(hù)此帖。




某公司高級面試題(2015-03-14)【感謝helder分享】
1、詳述Android系統(tǒng)架構(gòu),包括層與層之間調(diào)用、binder、jni、底層文件讀寫方法
2、描述自己的一個(gè)項(xiàng)目,要求畫出結(jié)構(gòu)圖,UML圖,詳細(xì)描述項(xiàng)目種的技術(shù)點(diǎn),技術(shù)難點(diǎn)以及解決方案
3、一道算法
4、談?wù)勛约喉?xiàng)目管理的方法、對敏捷軟件開發(fā)的理解


基礎(chǔ)面試題(2014-04-18)
1、請解釋下在單線程模型中Message,Handler,Message Queue,Looper之間的關(guān)系。
拿主線程來說,主線程啟動(dòng)時(shí)會調(diào)用Looper.prepare()方法,會初始化一個(gè)Looper,放入Threadlocal中,接著調(diào)用Looper.loop()不斷遍歷Message Queue,
Handler的創(chuàng)建依賴與當(dāng)前線程中的Looper,如果當(dāng)前線程沒有Looper則必須調(diào)用Looper.prepare()。Handler , sendMessage到MessageQueue,Looper不斷
從MessageQueue中取出消息,回調(diào)handleMessage方法。

2、如果有個(gè)100M大的文件,需要上傳至服務(wù)器中,而服務(wù)器form表單最大只能上傳2M,可以用什么方法。
這個(gè)問題不是很明確我覺得,首先來說使用http協(xié)議上傳數(shù)據(jù),特別在android下,跟form沒什么關(guān)系。傳統(tǒng)的在web中,在form中寫文件上傳,其實(shí)瀏覽器所做
的就是將我們的數(shù)據(jù)進(jìn)行解析組拼成字符串,以流的方式發(fā)送到服務(wù)器,且上傳文件用的都是POST方式,POST方式對大小沒什么限制。
回到題目,可以說假設(shè)每次真的只能上傳2M,那么可能我們只能把文件截?cái)啵缓蠓謩e上傳了。

3、內(nèi)存溢出和內(nèi)存泄漏有什么區(qū)別?何時(shí)會產(chǎn)生內(nèi)存泄漏?內(nèi)存優(yōu)化有哪些方法?
內(nèi)存溢出通俗理解就是軟件(應(yīng)用)運(yùn)行需要的內(nèi)存,超出了它可用的最大內(nèi)存。
內(nèi)存泄漏就是我們對某一內(nèi)存空間的使用,使用完成后沒有釋放。
內(nèi)存優(yōu)化:Android中容易內(nèi)存溢出的部分,就是圖片的加載,我們可以使用圖片的壓縮加上使用LruCache緩存的目的來控制圖片所能夠使用的內(nèi)存。
還有對于比較耗資源的對象及時(shí)的關(guān)閉,例如Database Conn , 各種傳感器 , Service 等等。

4、AsyncTask使用在哪些場景?它的缺陷是什么?如何解決?
AsyncTask 運(yùn)用的場景就是我們需要進(jìn)行一些耗時(shí)的操作,耗時(shí)操作完成后更新主線程,或者在操作過程中對主線程的UI進(jìn)行更新。
缺陷:AsyncTask中維護(hù)著一個(gè)長度為128的線程池,同時(shí)可以執(zhí)行5個(gè)工作線程,還有一個(gè)緩沖隊(duì)列,當(dāng)線程池中已有128個(gè)線程,緩沖隊(duì)列已滿時(shí),如果
此時(shí)向線程提交任務(wù),將會拋出RejectedExecutionException。
解決:由一個(gè)控制線程來處理AsyncTask的調(diào)用判斷線程池是否滿了,如果滿了則線程睡眠否則請求AsyncTask繼續(xù)處理。

5、Activity用SharedPreferences保存數(shù)據(jù),大小有木有限制?
這個(gè)真心查不到。。。

6、Activity間通過Intent傳遞數(shù)據(jù)大小有沒有限制?
貌似是40K。

7、assest文件夾里放文件,對于文件的大小有沒有限制?22
assets目錄更像一個(gè)附錄類型的目錄,Android不會為這個(gè)目錄中的文件生成ID并保存在R類當(dāng)中,因此它與Android中的一些類和方法兼容度更低。
同時(shí),由于你需要一個(gè)字符串路徑來獲取這個(gè)目錄下的文件描述符,訪問的速度會更慢。但是把一些文件放在這個(gè)目錄下會使一些操作更加方便,
比方說拷貝一個(gè)數(shù)據(jù)庫文件到系統(tǒng)內(nèi)存中。要注意的是,你無法在Android XML文件中引用到assets目錄下的文件,只能通過AssetManager來訪問
這些文件。數(shù)據(jù)庫文件和游戲數(shù)據(jù)等放在這個(gè)目錄下是比較合適的。另外,網(wǎng)上關(guān)于assets和raw的資料都千篇一律了,因此關(guān)于這兩者中單個(gè)文件
大小不能超過1M的**錯(cuò)誤**描述也在傳播,即如果讀取超過1M的文件會報(bào)"Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)"的
IOException,還引申出種種解決方案。個(gè)人認(rèn)為不應(yīng)該有這樣的限制,為了驗(yàn)證這個(gè)說法寫了個(gè)Demo,發(fā)現(xiàn)將近5M的壓縮包在assets和raw中
都能正常訪問,因此在這里糾正一下,理論上只要打包不超過Android APK 50M大小的限制都是沒有問題的。當(dāng)然了,不排除是Android很早期的
時(shí)候因?yàn)樵O(shè)備硬件原因aapt在編譯的時(shí)候?qū)@兩個(gè)文件夾大小做出了限制,如果是這樣,較新版的ADT應(yīng)該不會出現(xiàn)這種情況。

8、 啟動(dòng)一個(gè)程序,可以主界面點(diǎn)擊圖標(biāo)進(jìn)入,也可以從一個(gè)程序中跳轉(zhuǎn)過去,二者有什么區(qū)別?
是因?yàn)閱?dòng)程序(主界面也是一個(gè)app),發(fā)現(xiàn)了在這個(gè)程序中存在一個(gè)設(shè)置為<category android: />的activity,
所以這個(gè)launcher會把icon提出來,放在主界面上。當(dāng)用戶點(diǎn)擊icon的時(shí)候,發(fā)出一個(gè)Intent:
Intent intent = mActivity.getPackageManager().getLaunchIntentForPackage(packageName);
mActivity.startActivity(intent);   
跳過去可以跳到任意允許的頁面,如一個(gè)程序可以下載,那么真正下載的頁面可能不是首頁(也有可能是首頁),這時(shí)還是構(gòu)造一個(gè)Intent,startActivity.
這個(gè)intent中的action可能有多種view,download都有可能。系統(tǒng)會根據(jù)第三方程序向系統(tǒng)注冊的功能,為你的Intent選擇可以打開的程序或者頁面。所以唯一的一點(diǎn)
不同的是從icon的點(diǎn)擊啟動(dòng)的intent的action是相對單一的,從程序中跳轉(zhuǎn)或者啟動(dòng)可能樣式更多一些。本質(zhì)是相同的。

9、程序之間的親和性的理解。
1、默認(rèn)情況下一個(gè)應(yīng)用的所有Activity都是具有相同的affinity,都是從application中繼承,application的affinity默認(rèn)就是manifest的包名。
2、affinity對Activity來說,就像是身份證一樣,可以告訴所在的Task,自己屬于其中的一員。
3、應(yīng)用場合:
a:根據(jù)affinity重新為Activity選擇合適的宿主Task;
b:與allowTaskReparenting屬性配合;
c:啟動(dòng)Activity使用Intent設(shè)置了FLAG_ACTIVITY_NEW_TASK標(biāo)記。

10、同一個(gè)程序,但不同的Activity是否可以放在不同的Task任務(wù)棧中?
可以放在不同的Task中。需要為不同的activity設(shè)置不同的affinity屬性,啟動(dòng)activity的Intent需要包含F(xiàn)LAG_ACTIVITY_NEW_TASK標(biāo)記。

11、橫豎屏切換時(shí)候Activity的生命周期。
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會重新調(diào)用各個(gè)生命周期,只會執(zhí)行onConfigurationChanged方法

12、AIDL的全稱是什么?如何工作?

全稱是:Android Interface Define Language
在Android中, 每個(gè)應(yīng)用程序都可以有自己的進(jìn)程. 在寫UI應(yīng)用的時(shí)候, 經(jīng)常要用到Service. 在不同的進(jìn)程中, 怎樣傳遞對象呢? 顯然, Java中不允許跨進(jìn)程內(nèi)存共享.
因此傳遞對象, 只能把對象拆分成操作系統(tǒng)能理解的簡單形式, 以達(dá)到跨界對象訪問的目的. 在J2EE中,采用RMI的方式, 可以通過序列化傳遞對象. 在Android中, 則
采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實(shí)際上做起來卻比較麻煩。
AIDL(AndRoid接口描述語言)是一種借口描述語言; 編譯器可以通過aidl文件生成一段代碼,通過預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程的目的. 如果需要
在一個(gè)Activity中, 訪問另一個(gè)Service中的某個(gè)對象, 需要先將對象轉(zhuǎn)化成AIDL可識別的參數(shù)(可能是多個(gè)參數(shù)), 然后使用AIDL來傳遞這些參數(shù), 在消息的接收端, 使用
這些參數(shù)組裝成自己需要的對象.AIDL的IPC的機(jī)制和COM或CORBA類似, 是基于接口的,但它是輕量級的。它使用代理類在客戶端和實(shí)現(xiàn)層間傳遞值. 如果要使用AIDL,
需要完成2件事情: 1. 引入AIDL的相關(guān)類.; 2. 調(diào)用aidl產(chǎn)生的class.
AIDL的創(chuàng)建方法:
AIDL語法很簡單,可以用來聲明一個(gè)帶一個(gè)或多個(gè)方法的接口,也可以傳遞參數(shù)和返回值。 由于遠(yuǎn)程調(diào)用的需要, 這些參數(shù)和返回值并不是任何類型.
下面是些AIDL支持的數(shù)據(jù)類型:
1. 不需要import聲明的簡單Java編程語言類型(int,boolean等)
2. String, CharSequence不需要特殊聲明
3. List, Map和Parcelables類型, 這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡單數(shù)據(jù)類型, String等其他比支持的類型.
(另外: 我沒嘗試Parcelables, 在Eclipse+ADT下編譯不過, 或許以后會有所支持


13、dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念
      Dvm的進(jìn)程是dalivk虛擬機(jī)進(jìn)程,每個(gè)android程序都運(yùn)行在自己的進(jìn)程里面,每個(gè)android程序系統(tǒng)都會給他分配一個(gè)單獨(dú)的liunx uid(user id),
每個(gè)dvm都是linux里面的一個(gè)進(jìn)程.所以說這兩個(gè)進(jìn)程是一個(gè)進(jìn)程.

----------------------------------------------------------------------------------------------------------

1.        下列哪些語句關(guān)于內(nèi)存回收的說明是正確的? (b ) A、 程序員必須創(chuàng)建一個(gè)線程來釋放內(nèi)存
  B、內(nèi)存回收程序負(fù)責(zé)釋放無用內(nèi)存
  C、內(nèi)存回收程序允許程序員直接釋放內(nèi)存
  D、內(nèi)存回收程序可以在指定的時(shí)間釋放內(nèi)存對象
2.        下面異常是屬于Runtime Exception 的是(abcd)(多選)      A、ArithmeticException
      B、IllegalArgumentException
      C、NullPointerException
      D、BufferUnderflowException
3.         Math.round(11.5)等于多少(). Math.round(-11.5)等于多少(c). c    A、11 ,-11   B、11 ,-12   C、12 ,-11   D、12 ,-12
4.        下列程序段的輸出結(jié)果是:(b )
     void complicatedexpression_r(){
     int x=20, y=30;
     boolean b;
     b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;
     System.out.println(b);
     }
     A、true  B、false  C、1  D、011.activity5.        對一些資源以及狀態(tài)的操作保存,最好是保存在生命周期的哪個(gè)函數(shù)中進(jìn)行(d)
   A、onPause()  B、onCreate()   C、 onResume()   D、onStart()
6.        Intent傳遞數(shù)據(jù)時(shí),下列的數(shù)據(jù)類型哪些可以被傳遞(abcd)(多選)       A、Serializable  B、charsequence  C、Parcelable  D、Bundle
7.        android 中下列屬于Intent的作用的是(c)  A、實(shí)現(xiàn)應(yīng)用程序間的數(shù)據(jù)共享
  B、是一段長的生命周期,沒有用戶界面的程序,可以保持應(yīng)用在后臺運(yùn)行,而不會因?yàn)榍袚Q頁面而消失
  C、可以實(shí)現(xiàn)界面間的切換,可以包含動(dòng)作和動(dòng)作數(shù)據(jù),連接四大組件的紐帶
  D、處理一個(gè)應(yīng)用程序整體性的工作
8.        下列屬于SAX解析xml文件的優(yōu)點(diǎn)的是(b)      A、將整個(gè)文檔樹在內(nèi)存中,便于操作,支持刪除,修改,重新排列等多種功能
      B、不用事先調(diào)入整個(gè)文檔,占用資源少
      C、整個(gè)文檔調(diào)入內(nèi)存,浪費(fèi)時(shí)間和空間
      D、不是長久駐留在內(nèi)存,數(shù)據(jù)不是持久的,事件過后,若沒有保存數(shù)據(jù),數(shù)據(jù)就會
  消失
9.         下面的對自定style的方式正確的是(a)    A、 <resources>
       <style name="myStyle">
                            <itemname="android:layout_width">fill_parent</item>
                     </style>
</resources>
     B、 <style name="myStyle">
                            <itemname="android:layout_width">fill_parent</item>
   </style>
     C、 <resources>
                            <itemname="android:layout_width">fill_parent</item>
  </resources>
     D、 <resources>
                            <stylename="android:layout_width">fill_parent</style>
  </resources>
10.       在android中使用Menu時(shí)可能需要重寫的方法有(ac)。(多選)      A、onCreateOptionsMenu()
  B、onCreateMenu()
  C、onOptionsItemSelected()
  D、onItemSelected()
11.      在SQL Server Management Studio 中運(yùn)行下列T-SQL語句,其輸出值(c)。 SELECT @@IDENTITY  
     A、      可能為0.1
     B、       可能為3
     C、      不可能為-100
     D、      肯定為0
12.     在SQL Server 2005中運(yùn)行如下T-SQL語句,假定SALES表中有多行數(shù)據(jù),執(zhí)行查詢之     后的結(jié)果是(d)。 BEGIN TRANSACTION A
       Update SALES Set qty=30 WHERE qty<30
        BEGIN TRANSACTION B
              Update SALES Set qty=40 WHEREqty<40
              Update SALES Set qty=50 WHEREqty<50
              Update SALES Set qty=60 WHEREqty<60
        COMMIT TRANSACTION B
        COMMIT TRANSACTION A
A、SALES表中qty列最小值大于等于30
B、SALES表中qty列最小值大于等于40
C、SALES表中qty列的數(shù)據(jù)全部為50
D、SALES表中qty列最小值大于等于60
13.      在android中使用SQLiteOpenHelper這個(gè)輔助類時(shí),可以生成一個(gè)數(shù)據(jù)庫,并可以對數(shù)據(jù)庫版本進(jìn)行管理的方法可以是(ab)    A、getWriteableDatabase()
B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()
14.     android 關(guān)于service生命周期的onCreate()和onStart()說法正確的是(ad)(多選題)    A、當(dāng)?shù)谝淮螁?dòng)的時(shí)候先后調(diào)用onCreate()和onStart()方法
    B、當(dāng)?shù)谝淮螁?dòng)的時(shí)候只會調(diào)用onCreate()方法
    C、如果service已經(jīng)啟動(dòng),將先后調(diào)用onCreate()和onStart()方法
D、如果service已經(jīng)啟動(dòng),只會執(zhí)行onStart()方法,不在執(zhí)行onCreate()方法
15.     下面是屬于GLSurFaceView特性的是(abc)(多選) A、管理一個(gè)surface,這個(gè)surface就是一塊特殊的內(nèi)存,能直接排版到android的視圖
    view上。
B、管理一個(gè)EGL display,它能讓opengl把內(nèi)容渲染到上述的surface上。
C、讓渲染器在獨(dú)立的線程里運(yùn)作,和UI線程分離。
D、可以直接從內(nèi)存或者DMA等硬件接口取得圖像數(shù)據(jù)
16.     下面在AndroidManifest.xml文件中注冊BroadcastReceiver方式正確的(a)      A、<receiver android:name="NewBroad">
                     <intent-filter>
                            <action  
                   android:name="android.provider.action.NewBroad"/>
                <action>
                     </intent-filter>
              </receiver>
     B、<receiver android:name="NewBroad">
                     <intent-filter>
                   android:name="android.provider.action.NewBroad"/>
                     </intent-filter>
              </receiver>
     C、<receiver android:name="NewBroad">
                     <action  
                  android:name="android.provider.action.NewBroad"/>
             <action>
              </receiver>
     D、<intent-filter>
         <receiver android:name="NewBroad">
                           <action>
                   android:name="android.provider.action.NewBroad"/>
                  <action>
                     </receiver>
</intent-filter>
17.     關(guān)于ContenValues類說法正確的是(a)     A、他和Hashtable比較類似,也是負(fù)責(zé)存儲一些名值對,但是他存儲的名值對當(dāng)中的
        名是String類型,而值都是基本類型
     B、他和Hashtable比較類似,也是負(fù)責(zé)存儲一些名值對,但是他存儲的名值對當(dāng)中的
        名是任意類型,而值都是基本類型
     C、他和Hashtable比較類似,也是負(fù)責(zé)存儲一些名值對,但是他存儲的名值對當(dāng)中的
        名,可以為空,而值都是String類型     
     D、他和Hashtable比較類似,也是負(fù)責(zé)存儲一些名值對,但是他存儲的名值對當(dāng)中
        的名是String類型,而值也是String類型
18.     我們都知道Hanlder是線程與Activity通信的橋梁,如果線程處理不當(dāng),你的機(jī)器就會變得越慢,那么線程銷毀的方法是(a)      A、onDestroy()
      B、onClear()
      C、onFinish()
      D、onStop()
19.     下面退出Activity錯(cuò)誤的方法是(c)       A、finish()
         B、拋異常強(qiáng)制退出
       C、System.exit()
       D、onStop()
20.     下面屬于android的動(dòng)畫分類的有(ab)(多項(xiàng))       A、Tween  B、Frame C、Draw D、Animation
21.     下面關(guān)于Android dvm的進(jìn)程和Linux的進(jìn)程,應(yīng)用程序的進(jìn)程說法正確的是(d)        A、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,不一定擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM都是在Linux中的一個(gè)進(jìn)程,所以說可以認(rèn)為是同一個(gè)概念.
        B、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,不一定擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM不一定都是在Linux中的一個(gè)進(jìn)程,所以說不是一個(gè)概念.
        C、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM不一定都是在Linux中的一個(gè)進(jìn)程,所以說不是一個(gè)概念.
        D、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的 Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM都是在Linux中的一個(gè)進(jìn)程,所以說可以認(rèn)為是同一個(gè)概念.
22.       Android項(xiàng)目工程下面的assets目錄的作用是什么bA、放置應(yīng)用到的圖片資源。
B、主要放置多媒體等數(shù)據(jù)文件
C、放置字符串,顏色,數(shù)組等常量數(shù)據(jù)
D、放置一些與UI相應(yīng)的布局文件,都是xml文件
23.       關(guān)于res/raw目錄說法正確的是(a)A、這里的文件是原封不動(dòng)的存儲到設(shè)備上不會轉(zhuǎn)換為二進(jìn)制的格式

B、這里的文件是原封不動(dòng)的存儲到設(shè)備上會轉(zhuǎn)換為二進(jìn)制的格式

C、這里的文件最終以二進(jìn)制的格式存儲到指定的包中

D、這里的文件最終不會以二進(jìn)制的格式存儲到指定的包中

24.      下列對android NDK的理解正確的是(abcd )A、 NDK是一系列工具的集合
B、 NDK 提供了一份穩(wěn)定、功能有限的 API 頭文件聲明。
C、 使 “Java+C” 的開發(fā)方式終于轉(zhuǎn)正,成為官方支持的開發(fā)方式
D、 NDK 將是 Android 平臺支持 C 開發(fā)的開端

二.填空題
25.      android中常用的四個(gè)布局是framlayout,linenarlayout,relativelayout和tablelayout。26.      android 的四大組件是activiey,service,broadcast和contentprovide。27.      java.io包中的objectinputstreamobjectoutputstream類主要用于對對象(Object)的讀寫。28.      android 中service的實(shí)現(xiàn)方法是:startservice和bindservice。29.      activity一般會重載7個(gè)方法用來維護(hù)其生命周期,除了onCreate(),onStart(),onDestory()  外還有onrestart,onresume,onpause,onstop。30.     android的數(shù)據(jù)存儲的方式sharedpreference,文件,SQlite,contentprovider,網(wǎng)絡(luò)。31.     當(dāng)啟動(dòng)一個(gè)Activity并且新的Activity執(zhí)行完后需要返回到啟動(dòng)它的Activity來執(zhí)行的回調(diào)函數(shù)是startActivityResult()。32.     請使用命令行的方式創(chuàng)建一個(gè)名字為myAvd,sdk版本為2.2,sd卡是在d盤的根目錄下,名字為scard.img,并指定屏幕大小HVGA.____________________________________。33.       程序運(yùn)行的結(jié)果是:_____good and gbc__________。
   public classExample{
  String str=new String("good");
  char[]ch={'a','b','c'};
  public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch);
    System.out.print(ex.str+" and ");
    Sytem.out.print(ex.ch);
  }
  public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
}

34.      在android中,請簡述jni的調(diào)用過程。(8分)1)安裝和下載Cygwin,下載 Android NDK
  2)在ndk項(xiàng)目中JNI接口的設(shè)計(jì)
  3)使用C/C++實(shí)現(xiàn)本地方法
  4)JNI生成動(dòng)態(tài)鏈接庫.so文件
  5)將動(dòng)態(tài)鏈接庫復(fù)制到j(luò)ava工程,在java工程中調(diào)用,運(yùn)行java工程即可

35.     簡述Android應(yīng)用程序結(jié)構(gòu)是哪些?(7分)Android應(yīng)用程序結(jié)構(gòu)是:
  Linux Kernel(Linux內(nèi)核)、Libraries(系統(tǒng)運(yùn)行庫或者是c/c++核心庫)、Application  
  Framework(開發(fā)框架包)、Applications  (核心應(yīng)用程序)

36.     請繼承SQLiteOpenHelper實(shí)現(xiàn):(10分)   1).創(chuàng)建一個(gè)版本為1的“diaryOpenHelper.db”的數(shù)據(jù)庫,
   2).同時(shí)創(chuàng)建一個(gè) “diary” 表(包含一個(gè)_id主鍵并自增長,topic字符型100
       長度, content字符型1000長度)
    3).在數(shù)據(jù)庫版本變化時(shí)請刪除diary表,并重新創(chuàng)建出diary表。

publicclass DBHelper  extends SQLiteOpenHelper{

       public final static String DATABASENAME ="diaryOpenHelper.db";
       public final static int DATABASEVERSION =1;

       //創(chuàng)建數(shù)據(jù)庫
       public DBHelper(Context context,Stringname,CursorFactory factory,int version)
       {
              super(context, name, factory,version);
       }
       //創(chuàng)建表等機(jī)構(gòu)性文件
       public void onCreate(SQLiteDatabase db)
       {
              String sql ="create tablediary"+
                                   "("+
                                   "_idinteger primary key autoincrement,"+
                                   "topicvarchar(100),"+
                                   "contentvarchar(1000)"+
                                   ")";
              db.execSQL(sql);
       }
       //若數(shù)據(jù)庫版本有更新,則調(diào)用此方法
       public void onUpgrade(SQLiteDatabasedb,int oldVersion,int newVersion)
       {
              
              String sql = "drop table ifexists diary";
              db.execSQL(sql);
              this.onCreate(db);
       }
}

37.     頁面上現(xiàn)有ProgressBar控件progressBar,請用書寫線程以10秒的的時(shí)間完成其進(jìn)度顯示工作。(10分)答案
publicclass ProgressBarStu extends Activity {

       private ProgressBar progressBar = null;
       protected void onCreate(BundlesavedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.progressbar);
              //從這到下是關(guān)鍵
              progressBar = (ProgressBar)findViewById(R.id.progressBar);
              
              Thread thread = new Thread(newRunnable() {
                     
                     @Override
                     public void run() {
                            int progressBarMax =progressBar.getMax();
                            try {
                                   while(progressBarMax!=progressBar.getProgress())
                                   {
                                          
                                          intstepProgress = progressBarMax/10;
                                          intcurrentprogress = progressBar.getProgress();
                                          progressBar.setProgress(currentprogress+stepProgress);
                                          Thread.sleep(1000);
                                   }
                                   
                            } catch(InterruptedException e) {
                                   // TODO Auto-generatedcatch block
                                   e.printStackTrace();
                            }
                           
                     }
              });
              
              thread.start();

              //關(guān)鍵結(jié)束
       }
      
}
38.        請描述下Activity的生命周期。      必調(diào)用的三個(gè)方法:onCreate() --> onStart() --> onResume(),用AAA表示
(1)父Activity啟動(dòng)子Activity,子Actvity退出,父Activity調(diào)用順序如下
AAA --> onFreeze() --> onPause() --> onStop() --> onRestart()--> onStart(),onResume() …
(2)用戶點(diǎn)擊Home,Actvity調(diào)用順序如下
AAA --> onFreeze() --> onPause() --> onStop() -- Maybe -->onDestroy() – Maybe
(3)調(diào)用finish(), Activity調(diào)用順序如下
AAA --> onPause() --> onStop() --> onDestroy()
(4)在Activity上顯示dialog,Activity調(diào)用順序如下
AAA
(5)在父Activity上顯示透明的或非全屏的activity,Activity調(diào)用順序如下
AAA --> onFreeze() --> onPause()
(6)設(shè)備進(jìn)入睡眠狀態(tài),Activity調(diào)用順序如下
AAA --> onFreeze() --> onPause()
39.      如果后臺的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?      onSaveInstanceState()
      當(dāng)你的程序中某一個(gè)Activity A在運(yùn)行時(shí),主動(dòng)或被動(dòng)地運(yùn)行另一個(gè)新的Activity B,這個(gè)時(shí)候A會執(zhí)行onSaveInstanceState()。B完成以后又會來找A,這個(gè)時(shí)候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調(diào)用onCreate()方法,不同于直接啟動(dòng)的是這回onCreate()里是帶上了參數(shù)savedInstanceState;而沒被收回的就直接執(zhí)行onResume(),跳過onCreate()了。
40.       如何將一個(gè)Activity設(shè)置成窗口的樣式。      在AndroidManifest.xml 中定義Activity的地方一句話android:theme="@android:style/Theme.Dialog"或android:theme="@android:style/Theme.Translucent"就變成半透明的
41.     如何退出Activity?如何安全退出已調(diào)用多個(gè)Activity的Application?對于單一Activity的應(yīng)用來說,退出很簡單,直接finish()即可。
當(dāng)然,也可以用killProcess()和System.exit()這樣的方法。

但是,對于多Activity的應(yīng)用來說,在打開多個(gè)Activity后,如果想在最后打開的Activity直接退出,上邊的方法都是沒有用的,因?yàn)樯线叺姆椒ǘ际墙Y(jié)束一個(gè)Activity而已。
當(dāng)然,網(wǎng)上也有人說可以。
就好像有人問,在應(yīng)用里如何捕獲Home鍵,有人就會說用keyCode比較KEYCODE_HOME即可,而事實(shí)上如果不修改framework,根本不可能做到這一點(diǎn)一樣。
所以,最好還是自己親自試一下。

那么,有沒有辦法直接退出整個(gè)應(yīng)用呢?
在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接結(jié)束整個(gè)應(yīng)用。在使用時(shí)需要權(quán)限android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。

可是,在2.2,這個(gè)方法失效了。
在2.2添加了一個(gè)新的方法,killBackgroundProcesses(),需要權(quán)限android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是,它和2.2的restartPackage一樣,根本起不到應(yīng)有的效果。

另外還有一個(gè)方法,就是系統(tǒng)自帶的應(yīng)用程序管理里,強(qiáng)制結(jié)束程序的方法,forceStopPackage()。
它需要權(quán)限android.permission.FORCE_STOP_PACKAGES。
并且需要添加android:sharedUserId="android.uid.system"屬性
同樣可惜的是,該方法是非公開的,他只能運(yùn)行在系統(tǒng)進(jìn)程,第三方程序無法調(diào)用。
因?yàn)樾枰贏ndroid.mk中添加LOCAL_CERTIFICATE := platform。
而Android.mk是用于在Android源碼下編譯程序用的。

從以上可以看出,在2.2,沒有辦法直接結(jié)束一個(gè)應(yīng)用,而只能用自己的辦法間接辦到。

現(xiàn)提供幾個(gè)方法,供參考:

1、拋異常強(qiáng)制退出:
該方法通過拋異常,使程序ForceClose。
驗(yàn)證可以,但是,需要解決的問題是,如何使程序結(jié)束掉,而不彈出Force Close的窗口。

2、記錄打開的Activity:
每打開一個(gè)Activity,就記錄下來。在需要退出時(shí),關(guān)閉每一個(gè)Activity即可。

3、發(fā)送特定廣播:
在需要結(jié)束應(yīng)用時(shí),發(fā)送一個(gè)特定的廣播,每個(gè)Activity收到廣播后,關(guān)閉即可。

4、遞歸退出
在打開新的Activity時(shí)使用startActivityForResult,然后自己加標(biāo)志,在onActivityResult中處理,遞歸關(guān)閉。

除了第一個(gè),都是想辦法把每一個(gè)Activity都結(jié)束掉,間接達(dá)到目的。
但是這樣做同樣不完美。
你會發(fā)現(xiàn),如果自己的應(yīng)用程序?qū)γ恳粋(gè)Activity都設(shè)置了nosensor,在兩個(gè)Activity結(jié)束的間隙,sensor可能有效了。
但至少,我們的目的達(dá)到了,而且沒有影響用戶使用。

為了編程方便,最好定義一個(gè)Activity基類,處理這些共通問題。
42.    請介紹下Android中常用的五種布局。FrameLayout(框架布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)
43.    請介紹下Android的數(shù)據(jù)存儲方式。一.SharedPreferences方式
二.文件存儲方式
三.SQLite數(shù)據(jù)庫方式
四.內(nèi)容提供器(Content provider)方式
五. 網(wǎng)絡(luò)存儲方式
44.     請介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的。創(chuàng)建一個(gè)屬于你自己的Content provider或者將你的數(shù)據(jù)添加到一個(gè)已經(jīng)存在的Contentprovider中,前提是有相同數(shù)據(jù)類型并且有寫入Content provider的權(quán)限。
45.    如何啟用Service,如何停用Service。Android中的service類似于windows中的service,service一般沒有用戶操作界面,它運(yùn)行于系統(tǒng)中不容易被用戶發(fā)覺,
可以使用它開發(fā)如監(jiān)控之類的程序。
一。步驟
第一步:繼承Service類
public class SMSService extends Service { }
第二步:在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里對服務(wù)進(jìn)行配置:
<service android:name=".DemoService" />
二。Context.startService()和Context.bindService
服務(wù)不能自己運(yùn)行,需要通過調(diào)用Context.startService()或Context.bindService()方法啟動(dòng)服務(wù)。這兩個(gè)方法都可
以啟動(dòng)Service,但是它們的使用場合有所不同。
1.使用startService()方法啟用服務(wù),調(diào)用者與服務(wù)之間沒有關(guān)連,即使調(diào)用者退出了,服務(wù)仍然運(yùn)行。
使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止。
2.采用Context.startService()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會先調(diào)用服務(wù)的onCreate()方法,
接著調(diào)用onStart()方法。如果調(diào)用startService()方法前服務(wù)已經(jīng)被創(chuàng)建,多次調(diào)用startService()方法并
不會導(dǎo)致多次創(chuàng)建服務(wù),但會導(dǎo)致多次調(diào)用onStart()方法。
采用startService()方法啟動(dòng)的服務(wù),只能調(diào)用Context.stopService()方法結(jié)束服務(wù),服務(wù)結(jié)束時(shí)會調(diào)用
onDestroy()方法。


3.采用Context.bindService()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會先調(diào)用服務(wù)的onCreate()方法,
接著調(diào)用onBind()方法。這個(gè)時(shí)候調(diào)用者和服務(wù)綁定在一起,調(diào)用者退出了,系統(tǒng)就會先調(diào)用服務(wù)的onUnbind()方法,
。接著調(diào)用onDestroy()方法。如果調(diào)用bindService()方法前服務(wù)已經(jīng)被綁定,多次調(diào)用bindService()方法并不會
導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說onCreate()和onBind()方法并不會被多次調(diào)用)。如果調(diào)用者希望與正在綁定的服務(wù)
解除綁定,可以調(diào)用unbindService()方法,調(diào)用該方法也會導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法。
三。Service的生命周期
1.Service常用生命周期回調(diào)方法如下:

onCreate()
該方法在服務(wù)被創(chuàng)建時(shí)調(diào)用,該方法只會被調(diào)用一次,無論調(diào)用多少次startService()或bindService()方法,
服務(wù)也只被創(chuàng)建一次。 onDestroy()該方法在服務(wù)被終止時(shí)調(diào)用。


2. Context.startService()啟動(dòng)Service有關(guān)的生命周期方法
onStart() 只有采用Context.startService()方法啟動(dòng)服務(wù)時(shí)才會回調(diào)該方法。該方法在服務(wù)開始運(yùn)行時(shí)被調(diào)用。
多次調(diào)用startService()方法盡管不會多次創(chuàng)建服務(wù),但onStart()方法會被多次調(diào)用。

3. Context.bindService()
啟動(dòng)Service有關(guān)的生命周期方法
onBind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會回調(diào)該方法。該方法在調(diào)用者與服務(wù)綁定時(shí)被調(diào)用,
當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定,多次調(diào)用Context.bindService()方法并不會導(dǎo)致該方法被多次調(diào)用。
onUnbind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會回調(diào)該方法。該方法在調(diào)用者與服務(wù)解除綁定時(shí)被調(diào)用。
備注:
1. 采用startService()啟動(dòng)服務(wù)
     Intent intent =new Intent(DemoActivity.this, DemoService.class);
    startService(intent);
2.Context.bindService()啟動(dòng)
    Intent intent =new Intent(DemoActivity.this, DemoService.class);
   bindService(intent, conn, Context.BIND_AUTO_CREATE);
   //unbindService(conn);//解除綁定
46.    注冊廣播有幾種方式,這些方式有何優(yōu)缺點(diǎn)?請談?wù)凙ndroid引入廣播機(jī)制的用意。  Android廣播機(jī)制(兩種注冊方法)
在android下,要想接受廣播信息,那么這個(gè)廣播接收器就得我們自己來實(shí)現(xiàn)了,我們可以繼承BroadcastReceiver,就可以有一個(gè)廣播接受器了。有個(gè)接受器還不夠,我們還得重寫B(tài)roadcastReceiver里面的onReceiver方法,當(dāng)來廣播的時(shí)候我們要干什么,這就要我們自己來實(shí)現(xiàn),不過我們可以搞一個(gè)信息防火墻。具體的代碼:

public class SmsBroadCastReceiverextends BroadcastReceiver   
{  

   @Override  
   public void onReceive(Context context, Intent intent)   
   {   
       Bundle bundle = intent.getExtras();  
       Object[] object = (Object[])bundle.get("pdus");   
       SmsMessage sms[]=new SmsMessage[object.length];   
       for(int i=0;i<object.length;i++)  
       {   
            sms[0] =SmsMessage.createFromPdu((byte[])object);  
            Toast.makeText(context, "來自"+sms.getDisplayOriginatingAddress()+"的消息是:"+sms.getDisplayMessageBody(),Toast.LENGTH_SHORT).show();   
       }   
       //終止廣播,在這里我們可以稍微處理,根據(jù)用戶輸入的號碼可以實(shí)現(xiàn)短信防火墻。   
       abortBroadcast();   
   }   
      
}

當(dāng)實(shí)現(xiàn)了廣播接收器,還要設(shè)置廣播接收器接收廣播信息的類型,這里是信息:android.provider.Telephony.SMS_RECEIVED

我們就可以把廣播接收器注冊到系統(tǒng)里面,可以讓系統(tǒng)知道我們有個(gè)廣播接收器。這里有兩種,一種是代碼動(dòng)態(tài)注冊:

//生成廣播處理  
smsBroadCastReceiver = newSmsBroadCastReceiver();   
//實(shí)例化過濾器并設(shè)置要過濾的廣播  

IntentFilter intentFilter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");

//注冊廣播   
BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,intentFilter);  
一種是在AndroidManifest.xml中配置廣播

<?xml version="1.0"encoding="utf-8"?>  
<manifestxmlns:android="http://schemas.android.com/apk/res/android"  
     package="spl.broadCastReceiver"  
     android:versionCode="1"
     android:versionName="1.0">
   <application android:icon="@drawable/icon"android:label="@string/app_name">
       <activity android:name=".BroadCastReceiverActivity"  
                  android:label="@string/app_name">  
            <intent-filter>  
                <actionandroid:name="android.intent.action.MAIN" />  
                <categoryandroid:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
       </activity>  
           
       <!--廣播注冊-->  
       <receiver android:name=".SmsBroadCastReceiver">  
            <intent-filterandroid:priority="20">  
                <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  
            </intent-filter>  
       </receiver>  
           
   </application>  
      
   <uses-sdk android:minSdkVersion="7" />  
      
   <!-- 權(quán)限申請 -->  
   <uses-permissionandroid:name="android.permission.RECEIVE_SMS"></uses-permission>  
      
</manifest>   

兩種注冊類型的區(qū)別是:

    1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。

    2)第二種是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會被系統(tǒng)調(diào)用自動(dòng)運(yùn)行。
47.    請解釋下在單線程模型中Message、Handler、MessageQueue、Looper之間的關(guān)系。Handler簡介:

一個(gè)Handler允許你發(fā)送和處理Message和Runable對象,這些對象和一個(gè)線程的MessageQueue相關(guān)聯(lián)。每一個(gè)線程實(shí)例和一個(gè)單獨(dú)的線程以及該線程的MessageQueue相關(guān)聯(lián)。當(dāng)你創(chuàng)建一個(gè)新的Handler時(shí),它就和創(chuàng)建它的線程綁定在一起了。這里,線程我們也可以理解為線程的MessageQueue。從這一點(diǎn)上來看,Handler把Message和Runable對象傳遞給MessageQueue,而且在這些對象離開MessageQueue時(shí),Handler負(fù)責(zé)執(zhí)行他們。

Handler
有兩個(gè)主要的用途:(1)確定在將來的某個(gè)時(shí)間點(diǎn)執(zhí)行一個(gè)或者一些Message和Runnable對象。(2)在其他線程(不是Handler綁定線程)中排入一些要執(zhí)行的動(dòng)作。

Scheduling Message
,即(1),可以通過以下方法完成:
post(Runnable):Runnable
在handler綁定的線程上執(zhí)行,也就是說不創(chuàng)建新線程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post
這個(gè)動(dòng)作讓你把Runnable對象排入MessageQueue,MessageQueue受到這些消息的時(shí)候執(zhí)行他們,當(dāng)然以一定的排序。sendMessage這個(gè)動(dòng)作允許你把Message對象排成隊(duì)列,這些Message對象包含一些信息,Handler的hanlerMessage(Message)會處理這些Message.當(dāng)然,handlerMessage(Message)必須由Handler的子類來重寫。這是編程人員需要作的事。

當(dāng)posting或者sending到一個(gè)Hanler時(shí),你可以有三種行為:當(dāng)MessageQueue準(zhǔn)備好就處理,定義一個(gè)延遲時(shí)間,定義一個(gè)精確的時(shí)間去處理。后兩者允許你實(shí)現(xiàn)timeout,tick,和基于時(shí)間的行為。

當(dāng)你的應(yīng)用創(chuàng)建一個(gè)新的進(jìn)程時(shí),主線程(也就是UI線程)自帶一個(gè)MessageQueue,這個(gè)MessageQueue管理頂層的應(yīng)用對象(像activities,broadcast receivers等)和主線程創(chuàng)建的窗體。你可以創(chuàng)建自己的線程,并通過一個(gè)Handler和主線程進(jìn)行通信。這和之前一樣,通過post和sendmessage來完成,差別在于在哪一個(gè)線程中執(zhí)行這么方法。在恰當(dāng)?shù)臅r(shí)候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。


Message
簡介:
Message
類就是定義了一個(gè)信息,這個(gè)信息中包含一個(gè)描述符和任意的數(shù)據(jù)對象,這個(gè)信息被用來傳遞給Handler.Message對象提供額外的兩個(gè)int域和一個(gè)Object域,這可以讓你在大多數(shù)情況下不用作分配的動(dòng)作。
盡管Message的構(gòu)造函數(shù)是public的,但是獲取Message實(shí)例的最好方法是調(diào)用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收對象池中獲取一個(gè)。


MessageQueue
簡介:
這是一個(gè)包含message列表的底層類。Looper負(fù)責(zé)分發(fā)這些message。Messages并不是直接加到一個(gè)MessageQueue中,而是通過MessageQueue.IdleHandler關(guān)聯(lián)到Looper。
你可以通過Looper.myQueue()從當(dāng)前線程中獲取MessageQueue。


Looper
簡介:
Looper
類被用來執(zhí)行一個(gè)線程中的message循環(huán)。默認(rèn)情況,沒有一個(gè)消息循環(huán)關(guān)聯(lián)到線程。在線程中調(diào)用prepare()創(chuàng)建一個(gè)Looper,然后用loop()來處理messages,直到循環(huán)終止。

大多數(shù)和message loop的交互是通過Handler。

下面是一個(gè)典型的帶有Looper的線程實(shí)現(xiàn)。
  class LooperThread extends Thread {
      public Handler mHandler;
      
      public void run() {
          Looper.prepare();
         
          mHandler = new Handler() {
              public voidhandleMessage(Message msg) {
                  // process incomingmessages here
              }
          };
         
          Looper.loop();
      }
  }


48.       AIDL的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)?AIDL的英文全稱是Android Interface Define Language
當(dāng)A進(jìn)程要去調(diào)用B進(jìn)程中的service時(shí),并實(shí)現(xiàn)通信,我們通常都是通過AIDL來操作的
A工程:
首先我們在net.blogjava.mobile.aidlservice包中創(chuàng)建一個(gè)RemoteService.aidl文件,在里面我們自定義一個(gè)接口,含有方法get。ADT插件會在gen目錄下自動(dòng)生成一個(gè)RemoteService.java文件,該類中含有一個(gè)名為RemoteService.stub的內(nèi)部類,該內(nèi)部類中含有aidl文件接口的get方法。
說明一:aidl文件的位置不固定,可以任意
然后定義自己的MyService類,在MyService類中自定義一個(gè)內(nèi)部類去繼承RemoteService.stub這個(gè)內(nèi)部類,實(shí)現(xiàn)get方法。在onBind方法中返回這個(gè)內(nèi)部類的對象,系統(tǒng)會自動(dòng)將這個(gè)對象封裝成IBinder對象,傳遞給他的調(diào)用者。
其次需要在AndroidManifest.xml文件中配置MyService類,代碼如下:
<!-- 注冊服務(wù) -->  
<service android:name=".MyService">
  <intent-filter>
   <!--  指定調(diào)用AIDL服務(wù)的ID  -->
       <actionandroid:name="net.blogjava.mobile.aidlservice.RemoteService" />
   </intent-filter>
</service>
為什么要指定調(diào)用AIDL服務(wù)的ID,就是要告訴外界MyService這個(gè)類能夠被別的進(jìn)程訪問,只要?jiǎng)e的進(jìn)程知道這個(gè)ID,正是有了這個(gè)ID,B工程才能找到A工程實(shí)現(xiàn)通信。
說明:AIDL并不需要權(quán)限
B工程:
      首先我們要將A工程中生成的RemoteService.java文件拷貝到B工程中,在bindService方法中綁定aidl服務(wù)
      綁定AIDL服務(wù)就是將RemoteService的ID作為intent的action參數(shù)。
      說明:如果我們單獨(dú)將RemoteService.aidl文件放在一個(gè)包里,那個(gè)在我們將gen目錄下的該包拷貝到B工程中。如果我們將RemoteService.aidl文件和我們的其他類存放在一起,那么我們在B工程中就要建立相應(yīng)的包,以保證RmoteService.java文件的報(bào)名正確,我們不能修改RemoteService.java文件
         bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection, Context.BIND_AUTO_CREATE);
      ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service參數(shù)就是A工程中MyService類中繼承了RemoteService.stub類的內(nèi)部類的對象。
49.    請解釋下Android程序運(yùn)行時(shí)權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別。運(yùn)行時(shí)權(quán)限D(zhuǎn)alvik( android授權(quán))
文件系統(tǒng) linux 內(nèi)核授權(quán)

50.     系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。通過直接發(fā)送Uri把參數(shù)帶過去,或者通過manifest里的intentfilter里的data屬性

51.    你如何評價(jià)Android系統(tǒng)?優(yōu)缺點(diǎn)。答:Android平臺手機(jī) 5大優(yōu)勢:
一、開放性
在優(yōu)勢方面,Android平臺首先就是其開發(fā)性,開發(fā)的平臺允許任何移動(dòng)終端廠商加入到Android聯(lián)盟中來。顯著的開放性可以使其擁有更多的開發(fā)者,隨著用戶和應(yīng)用的日益豐富,一個(gè)嶄新的平臺也將很快走向成熟。開放性對于Android的發(fā)展而言,有利于積累人氣,這里的人氣包括消費(fèi)者和廠商,而對于消費(fèi)者來講,隨大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費(fèi)者將可以用更低的價(jià)位購得心儀的手機(jī)。
二、掙脫運(yùn)營商的束縛
在過去很長的一段時(shí)間,特別是在歐美地區(qū),手機(jī)應(yīng)用往往受到運(yùn)營商制約,使用什么功能接入什么網(wǎng)絡(luò),幾乎都受到運(yùn)營商的控制。從去年iPhone 上市,用戶可以更加方便地連接網(wǎng)絡(luò),運(yùn)營商的制約減少。隨著EDGE、HSDPA這些2G至3G移動(dòng)網(wǎng)絡(luò)的逐步過渡和提升,手機(jī)隨意接入網(wǎng)絡(luò)已不是運(yùn)營商口中的笑談,當(dāng)你可以通過手機(jī)IM軟件方便地進(jìn)行即時(shí)聊天時(shí),再回想不久前天價(jià)的彩信和圖鈴下載業(yè)務(wù),是不是像噩夢一樣?互聯(lián)網(wǎng)巨頭Google推動(dòng)的Android終端天生就有網(wǎng)絡(luò)特色,將讓用戶離互聯(lián)網(wǎng)更近。
三、豐富的硬件選擇
這一點(diǎn)還是與Android平臺的開放性相關(guān),由于Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產(chǎn)品。功能上的差異和特色,卻不會影響到數(shù)據(jù)同步、甚至軟件的兼容,好比你從諾基亞 Symbian風(fēng)格手機(jī) 一下改用蘋果 iPhone ,同時(shí)還可將Symbian中優(yōu)秀的軟件帶到iPhone上使用、聯(lián)系人等資料更是可以方便地轉(zhuǎn)移,是不是非常方便呢?
四、不受任何限制的開發(fā)商
Android平臺提供給第三方開發(fā)商一個(gè)十分寬泛、自由的環(huán)境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別致的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如可控制正是留給Android難題之一。
五、無縫結(jié)合的Google應(yīng)用
如今叱詫互聯(lián)網(wǎng)的Google已經(jīng)走過10年度歷史,從搜索巨人到全面的互聯(lián)網(wǎng)滲透,Google服務(wù)如地圖、郵件、搜索等已經(jīng)成為連接用戶和互聯(lián)網(wǎng)的重要紐帶,而Android平臺手機(jī)將無縫結(jié)合這些優(yōu)秀的Google服務(wù)。
再說Android的5大不足:
一、安全和隱私
由于手機(jī)與互聯(lián)網(wǎng)的緊密聯(lián)系,個(gè)人隱私很難得到保守。除了上網(wǎng)過程中經(jīng)意或不經(jīng)意留下的個(gè)人足跡,Google這個(gè)巨人也時(shí)時(shí)站在你的身后,洞穿一切,因此,互聯(lián)網(wǎng)的深入將會帶來新一輪的隱私危機(jī)。
二、首先開賣Android手機(jī)的不是最大運(yùn)營商
眾所周知,T-Mobile在23日,于美國紐約發(fā)布了Android首款手機(jī)G1。但是在北美市場,最大的兩家運(yùn)營商乃AT&T和Verizon,而目前所知取得Android手機(jī)銷售權(quán)的僅有 T-Mobile和Sprint,其中T-Mobile的3G網(wǎng)絡(luò)相對于其他三家也要遜色不少,因此,用戶可以買賬購買G1,能否體驗(yàn)到最佳的3G網(wǎng)絡(luò)服務(wù)則要另當(dāng)別論了!
三、運(yùn)營商仍然能夠影響到Android手機(jī)
在國內(nèi)市場,不少用戶對購得移動(dòng)定制機(jī)不滿,感覺所購的手機(jī)被人涂畫了廣告一般。這樣的情況在國外市場同樣出現(xiàn)。Android手機(jī)的另一發(fā)售運(yùn)營商Sprint就將在其機(jī)型中內(nèi)置其手機(jī)商店程序。
四、同類機(jī)型用戶減少
在不少手機(jī)論壇都會有針對某一型號的子論壇,對一款手機(jī)的使用心得交流,并分享軟件資源。而對于Android平臺手機(jī),由于廠商豐富,產(chǎn)品類型多樣,這樣使用同一款機(jī)型的用戶越來越少,缺少統(tǒng)一機(jī)型的程序強(qiáng)化。舉個(gè)稍顯不當(dāng)?shù)睦樱F(xiàn)在山寨機(jī)泛濫,品種各異,就很少有專門針對某個(gè)型號山寨機(jī)的討論和群組,除了哪些功能異常搶眼、頗受追捧的機(jī)型以外。
五、過分依賴開發(fā)商缺少標(biāo)準(zhǔn)配置
在使用PC端的Windows Xp系統(tǒng)的時(shí)候,都會內(nèi)置微軟Windows Media Player這樣一個(gè)瀏覽器程序,用戶可以選擇更多樣的播放器,如Realplay或暴風(fēng)影音等。但入手開始使用默認(rèn)的程序同樣可以應(yīng)付多樣的需要。在Android平臺中,由于其開放性,軟件更多依賴第三方廠商,比如Android系統(tǒng)的SDK中就沒有內(nèi)置音樂播放器,全部依賴第三方開發(fā),缺少了產(chǎn)品的統(tǒng)一性。

52.  什么是ANR 如何避免它?
  答:ANR:Application NotResponding,五秒

在Android中,活動(dòng)管理器和窗口管理器這兩個(gè)系統(tǒng)服務(wù)負(fù)責(zé)監(jiān)視應(yīng)用程序的響應(yīng)。當(dāng)出現(xiàn)下列情況時(shí),Android就會顯示ANR對話框了:

  對輸入事件(如按鍵、觸摸屏事件)的響應(yīng)超過5秒

  意向接受器(intentReceiver)超過10秒鐘仍未執(zhí)行完畢

  Android應(yīng)用程序完全運(yùn)行在一個(gè)獨(dú)立的線程中(例如main)。這就意味著,任何在主線程中運(yùn)行的,需要消耗大量時(shí)間的操作都會引發(fā)ANR。因?yàn)榇藭r(shí),你的應(yīng)用程序已經(jīng)沒有機(jī)會去響應(yīng)輸入事件和意向廣播(Intentbroadcast)。

  因此,任何運(yùn)行在主線程中的方法,都要盡可能的只做少量的工作。特別是活動(dòng)生命周期中的重要方法如onCreate()和 onResume()等更應(yīng)如此。潛在的比較耗時(shí)的操作,如訪問網(wǎng)絡(luò)和數(shù)據(jù)庫;或者是開銷很大的計(jì)算,比如改變位圖的大小,需要在一個(gè)單獨(dú)的子線程中完成(或者是使用異步請求,如數(shù)據(jù)庫操作)。但這并不意味著你的主線程需要進(jìn)入阻塞狀態(tài)已等待子線程結(jié)束 -- 也不需要調(diào)用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程為子線程提供一個(gè)句柄(Handler),讓子線程在即將結(jié)束的時(shí)候調(diào)用它(xing:可以參看Snake的例子,這種方法與以前我們所接觸的有所不同)。使用這種方法涉及你的應(yīng)用程序,能夠保證你的程序?qū)斎氡3至己玫捻憫?yīng),從而避免因?yàn)檩斎胧录^5秒鐘不被處理而產(chǎn)生的ANR。這種實(shí)踐需要應(yīng)用到所有顯示用戶界面的線程,因?yàn)樗麄兌济媾R著同樣的超時(shí)問題。

53.     什么情況會導(dǎo)致Force Close ?如何避免?能否捕獲導(dǎo)致其的異常?
  答:一般像空指針啊,可以看起logcat,然后對應(yīng)到程序中 來解決錯(cuò)誤

54.     Android本身的api并未聲明會拋出異常,則其在運(yùn)行時(shí)有無可能拋出runtime異常,你遇到過嗎?諾有的話會導(dǎo)致什么問題?如何解決?
55.     簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver

  答:一個(gè)activity呈現(xiàn)了一個(gè)用戶可以操作的可視化用戶界面

  一個(gè)service不包含可見的用戶界面,而是在后臺無限地運(yùn)行

  可以連接到一個(gè)正在運(yùn)行的服務(wù)中,連接后,可以通過服務(wù)中暴露出來的借口與其進(jìn)行通信

  一個(gè)broadcast receiver是一個(gè)接收廣播消息并作出回應(yīng)的component,broadcastreceiver沒有界面

  intent:content provider在接收到ContentResolver的請求時(shí)被激活。

  activity, service和broadcast receiver是被稱為intents的異步消息激活的。

一個(gè)intent是一個(gè)Intent對象,它保存了消息的內(nèi)容。對于activity和service來說,它指定了請求的操作名稱和待操作數(shù)據(jù)的URI

  Intent對象可以顯式的指定一個(gè)目標(biāo)component。如果這樣的話,android會找到這個(gè)component(基于manifest文件中的聲明)并激活它。但如果一個(gè)目標(biāo)不是顯式指定的,android必須找到響應(yīng)intent的最佳component。

  它是通過將Intent對象和目標(biāo)的intent filter相比較來完成這一工作的。一個(gè)component的intent filter告訴android該component能處理的intent。intent filter也是在manifest文件中聲明的。
56.      IntentService有何優(yōu)點(diǎn)?
  答:IntentService 的好處

  * Acitivity的進(jìn)程,當(dāng)處理Intent的時(shí)候,會產(chǎn)生一個(gè)對應(yīng)的Service

  * Android的進(jìn)程處理器現(xiàn)在會盡可能的不kill掉你

  * 非常容易使用

57.     橫豎屏切換時(shí)候activity的生命周期?
  1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次

  2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會執(zhí)行一次

  3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會重新調(diào)用各個(gè)生命周期,只會執(zhí)行onConfigurationChanged方法

  
如何將SQLite數(shù)據(jù)庫(dictionary.db文件)與apk文件一起發(fā)布?

  解答:可以將dictionary.db文件復(fù)制到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件?梢詫ictionary.db文件復(fù)制到res aw目錄中

58.     如何將打開res aw目錄中的數(shù)據(jù)庫文件?
  解答:在Android中不能直接打開res aw目錄中的數(shù)據(jù)庫文件,而需要在程序第一次啟動(dòng)時(shí)將該文件復(fù)制到手機(jī)內(nèi)存或SD卡的某個(gè)目錄中,然后再打開該數(shù)據(jù)庫文件。復(fù)制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然后將該InputStream對象中的數(shù)據(jù)寫入其他的目錄中相應(yīng)文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數(shù)據(jù)庫文件。

59.     Android引入廣播機(jī)制的用意?
  答:a:從MVC的角度考慮(應(yīng)用程序內(nèi))

 其實(shí)回答這個(gè)問題的時(shí)候還可以這樣問,android為什么要有那4大組件,現(xiàn)在的移動(dòng)開發(fā)模型基本上也是照搬的web那一套MVC架構(gòu),只不過是改了點(diǎn)嫁妝而已。android的四大組件本質(zhì)上就是為了實(shí)現(xiàn)移動(dòng)或者說嵌入式設(shè)備上的MVC架構(gòu),它們之間有時(shí)候是一種相互依存的關(guān)系,有時(shí)候又是一種補(bǔ)充關(guān)系,引入廣播機(jī)制可以方便幾大組件的信息和數(shù)據(jù)交互。

  b:程序間互通消息(例如在自己的應(yīng)用程序內(nèi)監(jiān)聽系統(tǒng)來電)

  c:效率上(參考UDP的廣播協(xié)議在局域網(wǎng)的方便性)

  d:設(shè)計(jì)模式上(反轉(zhuǎn)控制的一種應(yīng)用,類似監(jiān)聽者模式)


60.     Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念
  DVM指dalivk的虛擬機(jī)。每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。而每一個(gè)DVM都是在Linux 中的一個(gè)進(jìn)程,所以說可以認(rèn)為是同一個(gè)概念。

61.     sim卡的EF 文件有何作用
  sim卡的文件系統(tǒng)有自己規(guī)范,主要是為了和手機(jī)通訊,sim本身可以有自己的操作系統(tǒng),EF就是作存儲并和手機(jī)通訊用的

62.     嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,各有何特性
  頁式,段式,段頁,用到了MMU,虛擬空間等技術(shù)

63.      什么是嵌入式實(shí)時(shí)操作系統(tǒng), Android 操作系統(tǒng)屬于實(shí)時(shí)操作系統(tǒng)嗎?
  嵌入式實(shí)時(shí)操作系統(tǒng)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時(shí),能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時(shí)間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)。主要用于工業(yè)控制、軍事設(shè)備、航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時(shí)間有苛刻的要求,這就需要使用實(shí)時(shí)系統(tǒng)。又可分為軟實(shí)時(shí)和硬實(shí)時(shí)兩種,而android是基于linux內(nèi)核的,因此屬于軟實(shí)時(shí)。

64.     一條最長的短信息約占多少byte?
  中文70(包括標(biāo)點(diǎn)),英文160,160個(gè)字節(jié)。

65.     android中的動(dòng)畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么?
  兩種,一種是Tween動(dòng)畫、還有一種是Frame動(dòng)畫。Tween動(dòng)畫,這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng)、放大、縮小以及產(chǎn)生透明度的變化;另一種Frame動(dòng)畫,傳統(tǒng)的動(dòng)畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影。

66.     handler機(jī)制的原理
  andriod提供了Handler 和 Looper 來滿足線程間的通信。Handler先進(jìn)先出原則。Looper類用來管理特定線程內(nèi)對象之間的消息交換(MessageExchange)。

  1)Looper: 一個(gè)線程可以產(chǎn)生一個(gè)Looper對象,由它來管理此線程里的MessageQueue(消息隊(duì)列)。

  2)Handler: 你可以構(gòu)造Handler對象來與Looper溝通,以便push新消息到MessageQueue里;或者接收Looper從Message Queue取出)所送來的消息。

  3) Message Queue(消息隊(duì)列):用來存放線程放入的消息。

  4)線程:UIthread 通常就是main thread,而Android啟動(dòng)程序時(shí)會替它建立一個(gè)MessageQueue。
67.     說說mvc模式的原理,它在android中的運(yùn)用
 MVC(Model_view_contraller)”模型_視圖_控制器”。 MVC應(yīng)用程序總是由這三個(gè)部分組成。Event(事件)導(dǎo)致Controller改變Model或View,或者同時(shí)改變兩者。只要Controller改變了Models的數(shù)據(jù)或者屬性,所有依賴的View都會自動(dòng)更新。類似的,只要Contro
68.    DDMS和TraceView的區(qū)別? DDMS是一個(gè)程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器。
69.    java中如何引用本地語言 可以用JNI(java nativeinterface  java 本地接口)接口。

70.    談?wù)凙ndroid的IPC(進(jìn)程間通信)機(jī)制 IPC是內(nèi)部進(jìn)程通信的簡稱,是共享"命名管道"的資源。Android中的IPC機(jī)制是為了讓Activity和Service之間可以隨時(shí)的進(jìn)行交互,故在Android中該機(jī)制,只適用于Activity和Service之間的通信,類似于遠(yuǎn)程方法調(diào)用,類似于C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實(shí)現(xiàn)IPC接口,Client端調(diào)用IPC接口本地代理。
71.    NDK是什么NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發(fā)者迅速的開發(fā)C/C++的動(dòng)態(tài)庫,并能自動(dòng)將so和java 應(yīng)用打成apk包。

NDK集成了交叉編譯器,并提供了相應(yīng)的mk文件和隔離cpu、平臺等的差異,開發(fā)人員只需簡單的修改mk文件就可以創(chuàng)建出so




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:109770 發(fā)表于 2016-3-22 19:49 | 只看該作者
鴻神,Android面試是不是java也很重要啊,能不能總結(jié)一下java的面題啊
18樓  昨天 17:04發(fā)表 [回復(fù)]

貌似好久沒有更新了呢,還有就是每行的末尾都是看不到這個(gè)要怎么解決是瀏覽器的問題嗎?
17樓 p3p_ppp 2015-10-20 14:15發(fā)表 [回復(fù)]

第8解答的好像有點(diǎn)不對,兩者的區(qū)別在于堆棧。主界面啟動(dòng)是新建一個(gè)堆棧給activity,而在A的應(yīng)用啟動(dòng),則用的A的堆棧。
16樓  2015-10-15 18:34發(fā)表 [回復(fù)]

http://pan.baidu.com/s/1i3pSBMd
15樓 gs_wenbing 2015-10-12 14:57發(fā)表 [回復(fù)]

樓主你好:描述自己的一個(gè)項(xiàng)目,要求畫出結(jié)構(gòu)圖,UML圖,詳細(xì)描述項(xiàng)目種的技術(shù)點(diǎn),技術(shù)難點(diǎn)以及解決方案,這個(gè)怎么弄呢
14樓 DarkHorse_pxf 2015-08-23 21:24發(fā)表 [回復(fù)]

您好,第四條:“AsyncTask 運(yùn)用的場景就是我們需要進(jìn)行一些耗時(shí)的操作”。
我看官方文檔說的并不是這樣的:
AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.
13樓 小倪尋歡 2015-08-08 23:43發(fā)表 [回復(fù)]

為什么第一題沒解答.
12樓 jcxxxxx55 2015-07-19 16:40發(fā)表 [回復(fù)]

4、AsyncTask使用在哪些場景?它的缺陷是什么?如何解決?

128 指的是工作緩沖隊(duì)列的容量(里面放的是task), 正常情況下,如果CPU數(shù)量為4的話,工作線程數(shù)量也就是線程池的大小為5,線程池的最大大小為 9.
11樓 lalala_luo 2015-07-07 00:11發(fā)表 [回復(fù)]

lz ,橫豎屏切換時(shí)候Activity的生命周期稍有變化了 現(xiàn)在
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會執(zhí)行一次;
​2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會執(zhí)行一次;
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden|screenSize"時(shí),切屏不會重新調(diào)用各個(gè)生命周期;只會執(zhí)行只會執(zhí)行onconfigurationchanged
10樓 ljcmeng 2015-06-30 21:08發(fā)表 [回復(fù)]

感謝LZ分享
9樓 qiaocbao 2015-05-28 17:54發(fā)表 [回復(fù)]

大贊,謝謝博主
8樓 carbit_tianpan 2015-05-10 16:27發(fā)表 [回復(fù)]

真的很受用!
Re: 恨自己不能小清新 2015-10-09 15:42發(fā)表 [回復(fù)]

回復(fù)carbit_tianpan:大哥 敢不敢換句話說
7樓 joney_hy 2015-03-10 11:29發(fā)表 [回復(fù)]

看了之后,覺得自己好無知
6樓 一子非魚一 2015-03-10 00:04發(fā)表 [回復(fù)]

翔哥貌似好久沒有更新了、
5樓 chhhh22 2014-09-28 10:43發(fā)表 [回復(fù)]

很有用啊,希望博主不斷更新,造福新手
4樓 huohacker 2014-08-20 01:13發(fā)表 [回復(fù)]

每行數(shù)據(jù)顯示不完整啊
Re: zlmaritn 3天前 13:42發(fā)表 [回復(fù)]

回復(fù)huohacker:同樣問題
Re:  2015-08-17 17:20發(fā)表 [回復(fù)]

回復(fù)huohacker:同樣的問題!看不見啊
3樓 L_willin 2014-06-26 17:40發(fā)表 [回復(fù)]

0-0要繼續(xù)更新啊~~~
2樓 wanchunyangs40 2014-05-27 21:44發(fā)表 [回復(fù)] [引用] [舉報(bào)]

不錯(cuò) 學(xué)習(xí)了 開始不斷關(guān)注你的博客。
Re: 鴻洋_ 2014-05-27 23:45發(fā)表 [回復(fù)]

回復(fù)wanchunyangs40:多謝關(guān)注,共同學(xué)習(xí)
1樓 黃楓_ 2014-04-18 17:10發(fā)表 [回復(fù)]

不錯(cuò),,希望博主不斷更新啊
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表