如何安全退出已調用多個Activity的Application?
1.利用ActivityContainer來管理所有的Activity的引用
2.使用廣播通知BaseActivity結束
3.直接殺死進程
4.采用SingleTask的特點,結束應用
http://www.cnblogs.com/qifengshi/p/6477796.html
同一個程序不同的Activity如何放在不同的任務棧中?
需要為不同的activity設置不同的taskAffinity屬性,啟動activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK標記。
Service的生命周期
當用Context.startService()來啟動時,Service的生命周期依次為:oncreate——>onStartCommand——>onDestroy
當用Context.bindService()啟動時:onStart——>onBind——>onUnbind——>onDestroy
Service有哪些啟動方法,有什么區別,怎樣停用Service?
第一種是通過調用Context.startService()啟動,調用Context.stopService()結束
第二種方式是通過調用Context.bindService()啟動,調用Context.unbindservice()結束,
通過startService啟動時Service組件和應用程序沒多大的聯系;如果訪問者不主動關閉,Service就不會關閉
通過bindService進行綁定時,應用程序可以通過ServiceConnection進行數據交互
Handler 原理
Andriod提供了Handler 和 Looper 來滿足線程間的通信。Handler先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(MessageExchange)。
Looper: 一個線程可以產生一個Looper對象,由它來管理此線程里的MessageQueue(消息隊列)。
Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到MessageQueue里;或者接收Looper從Message Queue取出)所送來的消息。
Message Queue(消息隊列):用來存放線程放入的消息。
線程:UIthread 通常就是main thread,而Android啟動程序時會替它建立一個MessageQueue。
進程優先級
前臺進程:即與用戶正在交互的Activity或者Activity用到的Service等,如果系統內存不足時前臺進程是最后被殺死的
可見進程:可以是處于暫停狀態(onPause)的Activity或者綁定在其上的Service,即被用戶可見,但由于失去了焦點而不能與用戶交互
服務進程:其中運行著使用startService方法啟動的Service,雖然不被用戶可見,但是卻是用戶關心的,例如用戶正在非音樂界面聽的音樂或者正在非下載頁面自己下載的文件等;當系統要空間運行前兩者進程時才會被終止
后臺進程:其中運行著執行onStop方法而停止的程序,但是卻不是用戶當前關心的,例如后臺掛著的QQ,這樣的進程系統一旦沒了有內存就首先被殺死
空進程:不包含任何應用程序的程序組件的進程,這樣的進程系統是一般不會讓他存在的
AIDL 解決了什么問題
AIDL (Android Interface Definition Language) 是一種IDL 語言,用于生成可以在 Android 設備上兩個進程之間進行進程間通信(interprocess communication, IPC)的代碼。如果在一個進程中(例如Activity)要調用另一個進程中(例如 Service, 設置了屬性 android:process=”:remote” 后,Service 就會運行在另外一個進程)對象的操作,就可以使用AIDL生成可序列化的參數。 AIDL IPC機制是面向接口的,像COM或Corba一樣,但是更加輕量級。它是使用代理類在客戶端和實現端傳遞數據。
Sleep和Wait的區別
Sleep是一個線程類Thread的方法,它是線程睡眠一段時間后自動恢復
Wait是Object的方法,wait方法會進入一個等待鎖定池,只有針對此對象發送notify或者notifyall后才能重新進入運行狀態
android中的動畫有哪幾類,它們的特點和區別是什么?
兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
8、說說mvc模式的原理,它在android中的運用
mvc包含三個部分:
模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。
視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,想用用戶出發的相關事件,交給m哦得了處理。
android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:
1)視圖層(view):一般采用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如何你對android了解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作為view層,當然這里需要進行java和javascript之間的通 信,幸運的是,android提供了它們之間非常方便的通信實現。
2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業務邏輯層處理, 這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉。
3)模型層(model):對數據庫的操作、對網絡等的操作都應該在model里面處理,當然對業務計算等操作也是必須放在的該層的。
11、 你后臺的Activity被系統回收怎么辦:
onSaveInstanceState當你的程序中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B這個時候A會執行Java代碼publicvoid onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putLong("id", 1234567890);}B 完成以后又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回收的A就要重新調用onCreate()方法,不同于直接啟動的是這回onCreate()里是帶上參數savedInstanceState,沒被收回的就還是onResume就好了。savedInstanceState是一個Bundle對象,你基本上可以把他理解為系統幫你維護的一個Map對象。在onCreate()里你可能會用到它,如果正常啟動onCreate就不會有它,所以用的時候要判斷一下是否為空。Java代碼if(savedInstanceState != null){long id = savedInstanceState.getLong("id");}就像官方的Notepad教程 里的情況,你正在編輯某一個note,突然被中斷,那么就把這個note的id記住,再起來的時候就可以根據這個id去把那個note取出來,程序就完整一些。這也是看你的應用需不需要保存什么,比如你的界面就是讀取一個列表,那就不需要特殊記住什么,哦, 沒準你需要記住滾動條的位置...
15. 請介紹下Android的數據存儲方式。
Android提供了5種方式存儲數據:
1、使用SharedPreferences存儲數據;
2、文件存儲數據;pro...
3、SQLite數據庫存儲數據;
4、使用ContentProvider存儲數據;
5、網絡存儲數據;Android 中的數據存儲都是私有的,其他應用程序都是無法訪問的,除非通過ContentResolver獲取其他程序共享的數據。
16. 請介紹下ContentProvider是如何實現數據共享的。
一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。要想使應用程序的數據公開化,可通過2種方法:創建一個屬于你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型并且有寫入Content provider的權限。如何通過一套標準及統一的接口獲取其他應用程序暴露的數據?Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數據。
19. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關系。
簡單的說,Handler獲取當前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發和處理
21. 請解釋下Android程序運行時權限與文件系統權限的區別。
apk程序是運行在虛擬機上的,對應的是Android獨特的權限機制,只有體現到文件系統上時才使用linux的權限設置。android系統有的權限是基于簽名的。
28、IntentService有何優點?
答:IntentService 的好處Acitivity的進程,當處理Intent的時候,會產生一個對應的Service Android的進程處理器現在會盡可能的不kill掉你,非常容易使用
29、橫豎屏切換時候activity的生命周期?
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次2、設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次3、設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法
橫豎屏切換候重新調用onCreate使用禁止切換程調用onCreate需要橫屏豎屏使用同布局文件能種式行經我自寫代碼測試前豎屏經切換并使用橫屏布局文件豎屏布局文件使用橫屏狀態知道我寫合適本希望家討論問題通查閱Android API知android:onConfigurationChanged實際應ActivityonConfigurationChanged()AndroidManifest.xml添加訴代碼含義表示改變屏幕向、彈軟件盤隱藏軟鍵盤再執行onCreate()直接執行onConfigurationChanged()申明段代碼按照Activity命周期都執行onCreate()onCreate()通顯示前做些初始化工作所改變屏幕向操作都執行onCreate()能造重復初始化降低程序效率必且更能重復初始化導致數據丟失需要千萬避免
30. 如何將SQLite數據庫(dictionary.db文件)與apk文件一起發布?**
解答:可以將dictionary.db文件復制到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將dictionary.db文件復制到res aw目錄中
31. 如何將打開resaw目錄中的數據庫文件?**
解答:在Android中不能直接打開resaw目錄中的數據庫文件,而需要在程序第一次啟動時將該文件復制到手機內存或SD卡的某個目錄中,然后再打開該數據庫文件。復制的基本方法是使用getResources().openRawResource方法獲得resaw目錄中資源的 InputStream對象,然后將該InputStream對象中的數據寫入其他的目錄中相應文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數據庫文件。
32. Android引入廣播機制的用意?**
答:a:從MVC的角度考慮(應用程序內)其實回答這個問題的時候還可以這樣問,android為什么要有那4大組件,現在的移動開發模型基本上也是照搬的web那一套MVC架構,只不過 是改了點嫁妝而已。android的四大組件本質上就是為了實現移動或者說嵌入式設備上的MVC架構,它們之間有時候是一種相互依存的關系,有時候又是一 種補充關系,引入廣播機制可以方便幾大組件的信息和數據交互。b:程序間互通消息(例如在自己的應用程序內監聽系統來電)c:效率上(參考UDP的廣播協議在局域網的方便性)d:設計模式上(反轉控制的一種應用,類似監聽者模式)
34、android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區別
XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕松些,但一些性能敏感的數據庫或手機上還是主要采用SAX方 式,SAX讀取是單向的,優點:不占內存空間、解析屬性方便,但缺點就是對于套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML文件加載到內存 中去,這里Android開發網提醒大家該方法在查找方面可以和XPath很好的結合如果數據量不是很大推薦使用,而PULL常常用在J2ME對于節點處 理比較好,類似SAX方式,同樣很節省內存,在J2ME中我們經常使用的KXML庫來解析。
Sex解析
第一步:取得解析工廠。第二步:取得解析器。第三步:實例化一個解析對象。第四部:綁定解析目標和解析器。第五步:開始解析。
Dom解析==document
第一步:取得解析工廠。第二步:取得解析器。第三步:得到一個倒掛的Dom樹。第四步:把子節點放入到nodelist中。第五步:循環取得nodelist的節點。第六步:循環取得node里面的子節點。
Sex解析,可以直接從XML文件中找到解析的目標。
Dom解析,直接加載整個XML文件,循環取得Dom中的值。
WedView控件可以直接顯示一個網頁
35、DDMS和TraceView的區別?
DDMS是一個程序執行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器
36、Activity被回收了怎么辦?
只有另啟用了
37、java中如何引用本地語言
可以用JNI接口
38、談談Android的IPC機制
IPC是內部進程通信的簡稱, 是共享”命名管道”的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android中該機制,只適用于Activity和Service之間的通信,類似于遠程方法調用,類似于C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實現IPC接口,Client端調用IPC接口本地代理。
41 創建線程有幾種不同的方式?你喜歡哪一種?為什么?
1.繼承Thread類(重寫Runnable方法)代碼簡單,直接在方法里面操作。
2.實現Runnable接口(不用重寫)更符合面向對象的思想
3.應用程序可以使用Executor框架來創建線程池實現Runable接口這種方式更受歡迎,因為不要繼承Theard類,在應用設計中已經繼承了別的對象的情況下,這需要多繼承(Java不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用
4種activity的啟動模式
standard: 標準模式,一調用startActivity()方法就會產生一個新的實例。
singleTop: 如果已經有一個實例位于Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。如果不位于棧頂,會產生一個新的實例。
singleTask: 會在一個新的task中產生這個實例,以后每次調用都會使用這個,不會去產生新的實例了。
singleInstance: 這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity實例所處的task中,只能有這個activity實例,不能有其他的實例。
Dialog提示方式
時間提示 日期提示 消息提示 進度提示
44 IntentFilter(Intent過濾器)
對于顯式Intent,它的接受者已被指定,所以系統會自動把這個Intent發給指定的組件。但是對于隱式Intent,由于并沒有指定其組件名屬性,所以系統不知道該把它發給哪個組件名,于是系統就直接將其發出去,算是所有的組件都有權接收,這就需要定義一個組件可以接收到哪些Intent,所以就引入了IntentFilter(Intent過濾器)。
45 Intent的六大屬性
組建名稱 動作 數據 分類 額外信息 標識
data/type,你可以用Uri來做為data,比如Uri uri = Uri.parse(http://www.google.com );Intent i = new Intent(Intent.ACTION_VIEW,uri);手機的Intent分發過程中,會根據http://www.google.com 的scheme判斷出數據類型type手機的Brower則能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能處理http:的type,3、至于分類Category,一般不要去在Intent中設置它,如果你寫Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,這樣所有不設置Category(Intent.addCategory(String c);)的Intent都會與這個Category匹配。4、extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,比如,如果要執行“發送電子郵件”這個動作,可以將電子郵件的標題、正文等保存在extras里,傳給電子郵件發送組件。
46 Service的四大特點
①沒有用戶界面。②比Activity 的優先級高,不會輕易被Android系統終止。③即使Service被系統終止,在系統資源恢復后Service也將自動恢復運行狀態。④可用于進程間通信(Inter Process Communication,IPC),解決兩個不同Android應用程序進程之間的調用和通訊問題。
廣播生命周期
調用對象-實現onReceive-結束
android:gravity與android:layout_gravity的區別
答案:LinearLayout有兩個非常相似的屬性:android:gravity與android:layout_gravity。他們的區別在 于:android:gravity用于設置View組件的對齊方式,而android:layout_gravity用于設置Container組件的 對齊方式。
舉個例子,我們可以通過設置android:gravity="center"來讓EditText中的文字在EditText組件中居中顯示;同 時我們設置EditText的android:layout_gravity="right"來讓EditText組件在LinearLayout中居中 顯示。來實踐以下:
正如我們所看到的,在EditText中,其中的文字已經居中顯示了,而EditText組件自己也對齊到了LinearLayout的右側。
padding與margin的區別
padding填充的意思,指的是view中的content與view邊緣的距離,類似文本中的indent
而margin表示的是view的左邊緣與parent view的左邊緣的距離
margin一般用來描述控件間位置關系,而padding一般描述控件內容和控件的位置關系。
簡單,padding是站在父 view的角度描述問題,它規定它里面的內容必須與這個父view邊界的距離。margin則是站在自己的角度描述問題,規定自己和其他(上下左右)的 view之間的距離,如果同一級只有一個view,那么它的效果基本上就和padding一樣了。
50 異常的三種方式
RunTimeException: 運行時異常
Exception:程序員處理異常
Error:硬件異常,程序不對其做處理。
51 進程的優先級
前臺進程,可見進程,服務進程,后臺進程,空進程
52 運行時異常和一般異常區別
Java提供了兩類主要的異常:運行時異常runtime exception和一般異常checked exception。checked 異常。對于后者這種異常,JAVA要求程序員對其進行catch。所以,面對這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。運行時異常我們可以不處理。這樣的異常由虛擬機接管。出現運行時異常后,系統會把異常一直往上層拋,一直遇到處理代碼。如果不對運行時異常進行處理,那么出現運行時異常之后,要么是線程中止,要么是主程序終止。
53 Exception和Error區別
Exception:程序員處理異常(編程時候的異常,程序員可以控制)
Error:硬件異常,程序不對其做處理。(程序員不可控制)
54 File
對文件和目錄進行操作的類
獲取位圖
BitMapfactory, resource ,drawable
session和cookies的區別
session是儲存在服務器端的
cookies 是存儲在客戶端的即本地
list和map,set的區別
list是一個有續集和,可以重復
set跟list共用一個父類,set方法中不能有相同的元素
map以存儲鍵值對的形式,存儲的數據是無序的,key值不能相同
60 線程和進程?
1.定義
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
2.關系
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.
相對進程而言,線程是一個更加接近于執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
3.區別
進程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。
- 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
- 線程的劃分尺度小于進程,使得多線程程序的并發性高。
- 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
- 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
- 從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
4.優缺點
線程和進程在使用上各有優缺點:線程執行開銷小,但不利于資源的管理和保護;而進程正相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。
61 List和ArrayList的區別?
List是一個接口,是collection接口的一個字接口,是一個有序集合。而ArrayList是List的一個實現類,可以實現數組大小的改變,可以很方便實現增刪數組內元素的操作。
62 ==和equals區別?
值類型是存在內存的棧中,引用類型的變量在棧中存儲的是變量的地址,而本身存儲在堆中。
==操作是比較兩個變量的值是否相同,
對于比較引用類型變量,表示的是兩個變量在堆中的地址是否相同,即棧中的內容是否相同。
equals是比較兩個對象堆中內容是否相同。
==比較的是兩個對象的地址。
equals不能比對8大基本數據類型
顯然當equals為true時候,==不一定為true
63 內存泄漏
當一個對象已經不需要使用的時候,本該被回收的時候,有另外一個正在使用的對象,導致不能回收,存在內存中,形成了內存泄漏
單列模式造成的內存泄漏
非靜態內部類創建靜態實例造成的內存泄漏
Hanlder造成內存泄漏
線程造成內存泄漏
資源未關閉造成的內存泄漏(廣播,File,BitMap,Cursor)
res和assets文件夾區別
相同點:兩者屬于靜態,目錄下的文件在打包后會原封不動的保存在apk包中,不會被編譯成二進制
不同點:res/raw中的文件會被映射到R.java文件中,訪問時候直接R.id.find....
65 HashMap和HashTable的區別
1.HashTable是基于陳舊的ictionary類,HashMap是java1.2引進的map接口的一個實現
2.HashTable是線程安全的,同步 HashMap線程不安全,不同步
3.只有HashMap可以讓你將空值作為一個表的條目的key value
4.Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。
66 this和Super的區別?
this表示當前對象,super表示當前的父類
舉例:一個類A,這個A繼承了B, B是A的父類。 如果A和B中都有一個aa(); 的方法
那么在A中this.aa();就是調用A中定義的方法,而Super.aa()調用的就是A的父類B中定義的方法aa();
67 JAVA中的IO分類
1.字節流
InputStream-文件輸入流FileInputStream
OutputStream-文件輸出流FileOutputStream
2.字符流
Reader-字符串輸入流BufferedReader
Writer-字符串輸出流BufferedWriter
3.對象流
ObjectInputStream,ObjectOutputStream
int 和 Integer 有什么區別
Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。Int是java的原始數據類型,Integer是java為int提供的封裝類。Java為每個原始類型提供了封裝類。
int = 0 integer = null
跳出循環?
break; return; continue;