android基礎知識三

1.listview失去焦點怎麼處理
在listview子佈局裏面寫,可以解決焦點失去的問題
android:descendantFocusability="blocksDescendants"
2.什麼是匿名內部類,在什麼時候調用
內部類:內部類可以是static的或者非static的,static內部類只能包含靜態方法和靜態類變量,只能訪問外部類的靜態元素,內部類可以實例化,多次使用。
匿名內部類:它只能使用一次,不區分static和非static。如果用到外部類的變量的話,必須是類變量或者實例變量,就是必須是類定義的變量,或者final的局部變量。匿名內部類如果是繼承某個類的話是可以重寫那個類的方法的,這個和普通內部類一樣。
實現事件監聽器的時候
用匿名內部類編碼非常簡潔,也容易讀懂,不重複利用時使用。
3.android中asset和raw的區別;
*res/raw和assets的相同點:
1.兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。

*res/raw和assets的不同點:
1.res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾
*讀取文件資源:
1.讀取res/raw下的文件資源,通過以下方式獲取輸入流來進行寫操作
InputStream is = getResources().openRawResource(R.id.filename);
//通過 資源 id 直接打開 raw 下的 流文件

2.讀取assets下的文件資源,通過以下方式獲取輸入流來進行寫操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");
// 通過 AssectManager 管理器 來打開 assect 下的流文件
4.什麼是線程
線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建撤消另一個線程,同一進程中的多個線程之間可以併發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒阻塞運行三種基本狀態。每一個程序都至少有一個線程,那就是程序本身。
線程是程序中一個單一的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱爲多線程
5.線程和進程的區別
// 線程與進程的區別:
定義:
  1. 進程是系統進行資源分配和調度的一個獨立單位
  2. 線程是進程的一個實體,是CPU調度和分派的基本單位,線程自己基本上不擁有系統資源,只擁有一點在系統運行中必不可少的資源,但是它可與同屬一個進程的其他線程共享進程所擁有的全部資源
關係:
  1. 一個線程可以創建和撤銷另一個線程,同一個進程中的多個線程可以同時併發執行,他可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行順序
區別:
進程和線程區別: 他們是不同的操作系統資源管理方式。
進程有獨立的地址空間,一個進程崩潰後,不會對其他進程產生影響
線程只是一個進程中不同的執行路徑,線程有自己的堆棧和局部變量,線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉, 所以多線程的操作要比多進程的程序健壯。 但在進程切換時耗費資源較大,效率要差一些
對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程,(因爲進程在切換時耗費的資源要大一些,效率差一些)
進程是表示資源分配的基本單位,又是調度運行的基本單位。
線程是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。
線程的優點:
(1)易於調度。
(2)提高併發性。通過線程可方便有效地實現併發性。進程可創建多個線程來執行同一程序的不同部分。
(3)開銷少。創建線程比創建進程要快,所需開銷很少。。
(4)利於充分發揮多處理器的功能。通過創建多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程序的併發性,使每個處理器都得到充分運行。
進程和線程的關係:
(1)一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。 (2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。
(3)處理機分給線程,即真正在處理機上運行的是線程。
(4)線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。
6.接口和抽象類的區別
abstract可以修飾抽象方法,而一個類只要有一個抽象方法,就必須用
abstract定義該類,即抽象類。
用interface修飾的類,裏面的方法都是抽象方法,因此在定義接口的時候,可以
直接不加那些修飾,系統會默認的添上去。接口裏面的字段都是公有常量,即
public static final修飾的字段。
//接口是多繼承 、抽象類是單繼承
//接口裏面只有抽象方法
// 抽象類: 有抽象方法和普通方法 、 抽象類==父類( 抽象類是 頂級父類 )
// 比較兩個對象是否相等 == 比較的是地址、 = 比較的是值
//final不能和 static 、actaret 一起使用
7.xml有幾種解析方式、區別
基本的解析方式有三種: DOM,SAX,Pull
dom解析:解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後就可以使用 DOM 接口來操作這個樹結構。優點是對文檔增刪改查比較方便,缺點佔用內存比較大。
sax解析:基於事件驅動型,優點佔用內存少,解析速度快,缺點是隻適合做文檔的讀取,不適合做文檔的增刪改,不能中途停止。
pull解析:同樣基於事件驅動型,android 官方API提供,可隨時終止,調用next() 方法提取它們(主動提取事件)
8.webview的輔助類
WebSettings、WebViewClient、WebChromeClient
WebSettings
設置WebView的一些屬性、狀態等,例如允許使用javascript,允許使用緩存,允許使用內置的縮放組件
setJavaScriptEnabled(true); 設置支持js
WebViewClient
主要幫助WebView處理各種通知、請求事件(例如,點擊鏈接時候如何顯示界面,頁面開始加載,加載完畢之後有何動作等)
shouldOverrideUrlLoading() onPageStarted() onPageFinished()
WebChromeClient
輔助WebView處理Javascript的對話框、網站圖標、網站Title、加載進度等
核心方法有onJsAlert() onJsConfirm() onJsPrompt() onProgressChanged() onReceivedIcon()
onReceivedTitle()
9.webview加載網頁的兩種方式
loadUrl(url) 通過url地址加載互聯網或本地網頁
如:loadUrl("http://www.baidu.com"); // 互聯網地址
loadUrl("file://android_asset/html/index.html"); //本地網頁
loadData(data,type,encoding) 直接加載網頁內容,容易亂碼,一般用loadDataWithBaseURL代替
10.Intent可以被傳遞的數據類型
intent是連接Activity, Service, BroadcastReceiver, ContentProvider四大組件的信使,,可以傳遞八種基本數據類型以及string, Bundle類型,以及實現了Serializable(java)或者Parcelable(安卓)的類型。
Intent可以劃分成顯式意圖和隱式意圖。
顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent爲顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。
隱式意圖:沒有明確指定組件名的Intent爲隱式意圖。 Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。
11.攔截短信短信其實是一個有序廣播
1:創建一個繼承BroadcastReceiver類的廣播接收器。
2:在清單文件中註冊廣播並在<intent-filter>中設置優先級 priority(只要比你想攔截程序的短信接收器優先級高就可以了)
3:在onReceiver()中調用abortBroadcast()就可以了
12.Throws與Throw的區別
1.throw則是指拋出的一個具體的異常類型。
2.通常在一個方法(類)的聲明處通過throws聲明方法(類)可能拋出的異常信息,而在方法(類)內部通過throw聲明一個具體的異常信息。
3.throws通常不用顯示的捕獲異常,可由系統自動將所有捕獲的異常信息拋給上級方法;
throw則需要用戶自己捕獲相關的異常,而後在對其進行相關包裝,最後在將包裝後的異常信息拋出。
如果在方法中會有異常被拋出而你又不希望在這個方法體內對此異常進行處理,可以使用throws在聲明方法的時候同時聲明他可能會跑出的異常。
4.兩者位置不同.
13.Service是如何啓動
1通過startService
Service會經歷onCreate->onStart
stopService的時候直接onDestroy

  如果是調用者(TestServiceHolder)自己直接退出而沒有調用stopService的
  話,Service會一直在後臺運行。
  下次TestServiceHolder再起來可以stopService。


2通過bindService
Service只會運行onCreate,這個時候TestServiceHolder和TestService綁定在一起

TestServiceHolder退出了,Srevice就會調用onUnbind->onDestroyed
  所謂綁定在一起就共存亡了。
14.android虛擬機的進程和linux的關係
DVM指dalivk的虛擬機。每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux中的一個進程,所以說可以認爲是同一個概念。
15.程序運行的權限和文件系統權限的區別
運行時權限 Dalvik( android 授權) 文件系統 linux 內核授權
16.訪問網絡如何加密
1:對稱加密(DES,AES)和非對稱(RSA公鑰與私鑰)。
(支付寶裏的商戶的公鑰和私鑰)
2:MD5(算法)
3:Base64
17.訪問網絡都有哪兩種方式
get與post是兩種不同的提交方式
get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。
get安全性非常低,post安全性較高。
HTTP 定義了與服務器交互的不同方法,最基本的方法是 GET 和 POST。事實上 GET 適用於多數請求,而保留 POST 僅用於更新站點。
18.一鍵退出的實現
定義一個類繼承Application,定義一個集合存放所有的activity,定義一個添
加的方法,再寫一個退出的方法,使用for循環全部調用finish方法,然後在每個
Activity的onCreate方法中調用自定義類裏的添加方法,然後在需要使用一鍵退出
的地方調用類中的退出方法即可。
19.gc是什麼
GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。
20.listview的分頁加載
ListView分頁加載通常有兩種實現方式:一種是ListView底部設置一個按鈕,用戶點擊即加載;另一種是當用戶滑動到底部時自動加載。
在此說一下第一種方式點擊底部按鈕即加載的實現思路:

通過addFooterView()方法爲listview底部加入一個“加載更多”按鈕和加載進度的視圖,默認按鈕顯示,加載進度爲gone。當用戶點擊“加載更多”按鈕時,按鈕設置爲gone,加載進度顯示,並開啓子線程從網絡上加載下一頁數據,加載完畢,發消息給handler,再handler的handleMessage()方法中通過adapter的notifyDataSetChanged方法通知listview刷新,顯示剛加入的數據,並恢復按鈕顯示,加載進度隱藏。

21、說說java的反射機制原理以及應用場合
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有
屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態
獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
類對象: 封裝了類的描述信息的對象,類加載的產物,由jvm創建java.lang.Class
應用場景: Gson 序列化反序列化
獲取類對象的方式:1. 類名.class2. 類的對象.getClass()3. Class.forName("
包名.類名")
22、contentprovider怎麼實現數據共享
一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。
要想使應用程序的數據公開化,可通過2種方法:創建一個屬於你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型並且有寫入Content provider的權限。
如何通過一套標準及統一的接口獲取其他應用程序暴露的數據?
Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數據。
23、java有幾種引用類型
強引用,軟引用、弱引用、幽靈引用、
24、如何讓Activity變成一個窗口?
答:在清單文件AndroidManifest.xml中相應的<activity>標籤內設置屬性
android :theme="@android:style/Theme.Dialog"
25,啓動一個線程時run()還是start()
start()
26,ArrayList的便利
ArrayList<String> al=new ArrayList<String>();
for(int i=0;i<10;i++){
al.add(String.valueOf(i));
}
Iterator<String> it=al.iterator();
while(it.hasNext()){
System.out.println(it.next());
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章