什麼是Activity?
通俗一點說Activity就是一個介面,這個介面裡面可以放置各種控制項。Activity的介面也是用xml檔案表示的,放置在res->layout下面。每產生一個新的Activity後,我們需要在AndroidManifest.xml中註冊一下這個activity
Activity生命週期
onCreate(Bundle savedInstanceState):建立activity時調用。設定在該方法中,還以Bundle的形式提供對以前儲存的任何狀態的訪問!
onStart():activity變為在螢幕上對使用者可見時調用。
onResume():activity開始與使用者互動時調用(無論是啟動還是重新啟動一個活動,該方法總是被調用的)。
onPause():activity被暫停或收回cpu和其他資源時調用,該方法用於儲存活動狀態的,也是保護現場,壓棧吧!
onStop():activity被停止並轉為不可見階段及後續的生命週期事件時調用。
onRestart():重新啟動activity時調用。該活動仍在棧中,而不是啟動新的活動。
onDestroy():activity被完全從系統記憶體中移除時調用,該方法被調用
函數調用過程:
啟動第一個Activity的時候:
第一次建立onCreate()-->Activity可見了onStart()-->Activity可以操作了onResume()。
兩個Activity之間跳轉時必然會執行的是哪幾個方法
onCrante() //在Activity生命週期開始時調用
onRestoreInstanceState()//用來恢複UI狀態
onReStart()//當Activity重新啟動時調用
onStart()//Activity對使用者即將可見時調用
onResume()//當Activity與使用者互動時,繪製介面
onSaveInstanceState()//activity即將移出棧頂保留UI狀態時調用
onPause()//暫停當前活動activity,提交持久資料的改變,停止動畫和其他佔用CPU資源的東西,由於下一個activity在這個方法返回之前不會resume,所以這個方法的代碼執行要快。
onStop()//activity不再可見時調用
onDestroy()//在Activity銷毀錢被調用的最後一個方法。
點擊第一個Activity上的按鈕通過Intent跳到第二個Activity:
第一個Activity暫停onPause()-->建立第二個ActivityonCreate()-->Activity可見onStart()-->Activity可操作onResume()-->第一個Activity被第二個Activity完全遮蓋onStop()(如果調用了finish(),或者系統資源緊缺,則會被銷毀onDestory())。
點擊系統返回功能建,從第二個Activity回到第一個Activity :
第二個Activity暫停onPause()-->第一個Activity重啟動OnRestart()(並沒有被銷毀,如果銷毀了則要建立onCreate())-->第一個Activity可見onStart()-->第一個Activity可操作onResume()-->第二個Activity被完全遮蓋onStop()(如果調用了finish(),或者系統資源緊缺,則會被銷毀onDestory())。
橫豎屏切換時候Activity的生命週期
1、不設定Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設定Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次
3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
如何將一個Activity設定成視窗的樣式
1、在你的styles.xml檔案中可以建立一如下的類似Dialog的style
<style name="Theme.FloatActivity"parent="android:style/Theme.Dialog"></style>
2、在AndroidManifest.xml中在你需要顯示為視窗的activity中添加如下屬性:android:theme="@style/Theme.FloatActivity" 即可
也可以直接添加您對應需要展示為Dialog style的Activity的android:theme屬性值為android:theme="@android:style/Theme.Dialog"。
你背景Activity被系統回收怎麼辦?
系統會幫我們記錄下回收前Activity的狀態,再次調用被回收的Activity就要重新調用onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上參數savedInstanceState。savedInstanceState是一個Bundle對象,你基本上可以把他理解為系統幫你維護的一個Map對象,我們使用savedInstanceState可以恢複到回收前的狀態。
如何退出Activity?如何安全退出已調用多個Activity的Application?
用finish()方法退出activity.
兩個Activity之間怎麼傳遞資料?
在Intent的對象中增加要傳遞的參數既可。在Intent的對象的請求中加入索引值對,對象名字.putExtra("索引值對的名字","索引值對的值");在另一個Activity中將Intent請求中的資料取出來:Intent intent=getIntent();//String value = intent.getStringExtra("testIntent");//將testIntent對應的值賦值給value
怎麼在啟動一個Activity時就啟動一個service?
將啟動Service的語句放在onCreate()方法中
同一個程式,但不同的Activity是否可以放在不同的Task任務棧中?
可以放在不同的Task中。需要為不同的activity設定不同的taskaffinity屬性,啟動activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK標記。
Activity怎麼和service綁定,怎麼在activity中啟動自己對應的service?
1、Activity能進行綁定得益於Service的介面。為了支援Service的綁定,實現onBind方法。
2、Service和Activity的串連可以用ServiceConnection來實現。你需要實現一個新的ServiceConnection,重寫onServiceConnected和onServiceDisconnected方法,一旦串連建立,你就能得到Service執行個體的引用。
3、執行綁定,調用bindService方法,傳入一個選擇了要綁定的Service的Intent(顯式或隱式)和一個你實現了的ServiceConnection執行個體
什麼是Service以及描述下它的生命週期
Android Service是運行在背景代碼,不能與使用者互動,可以運行在自己的進程,也可以運行在其他應用程式進程的上下文裡。需要通過某一個Activity或者其他Context對象來調用,Context.startService() 和Context.bindService()。如果在Service執行耗時的操作需要啟動一個新線程來執行。
Android Service只繼承了onCreate(),onStart(),onDestroy()三個方法,當我們第一次啟動Service時,先後調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,這裡需要注意的是,如果Service已經啟動了,當我們再次啟Service時,不會在執行onCreate()方法,而是直接執行onStart()方法。
Service有哪些啟動方法,有什麼區別,怎樣停用Service?
兩種啟動Service的方式Context.startService() 和Context.bindService()。
區別為:
Context.startService():Service會經曆onCreate -> onStart(如果Service還沒有運行,則android先調用onCreate()然後調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次);stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後台運行。該Service的調用者再啟動起來後可以通過stopService關閉Service
Context.bindService():Service會經曆onCreate() -> onBind(),onBind將返回給用戶端一個IBind介面執行個體,IBind允許用戶端回調服務的方法,比如得到Service啟動並執行狀態或其他動作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind -> onDestroyed相應退出,所謂綁定在一起就共存亡了。
停用service使用context.stopService()
不用service,B頁面為音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?
a 使用startActivityForResult() 方法開啟b,b類結束時調用finish();
a類的intent有一個子activity結束事件onActivityResult(),在事件裡繼續播放音樂
什麼是IntentService?有何優點?
IntentService也是一個Service,是Service的子類,IntentService和Service有所不同,通過Looper和Thread來解決標準Service中處理邏輯的阻塞問題。
優點:Acitivity的進程,當處理Intent的時候,會產生一個對應的Service
Android的進程處理器現在會儘可能的不kill掉你
非常容易使用
日曆中IntentService的應用
什麼時候使用Service?
比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後台繼續播放,比如檢測SD卡上檔案的變化,再或者在後台記錄你地理資訊位置的改變等等,總之服務嘛,總是藏在後頭的。
請描述一下Intent 和 Intent Filter
Intent在Android中被翻譯為"意圖",熟語來講就是目的,他們是三種應用程式基底本組件—activity,service和broadcast receiver之間互相啟用的手段。在調用Intent名稱時使用ComponentName也就是類的全名時為顯示調用。這種方式一般用於應用程式的內部調用,因為你不一定會知道別人寫的類的全名。我們來看看隱式Intent怎麼用?首先我們先配置我們的Activity的Intent Filter
<intent-filter><actionandroid:name="com.example.project.SHOW_CURRENT"/></intent-filter>
這樣在調用的時候指定Intent的action,系統就是自動的去對比是哪個intent-filter符合我們的Activity,找到後就會啟動Activity。
一個intent filter是IntentFilter類的執行個體, 但是它一般不出現在代碼中,而是出現在android Manifest檔案中, 以<intent-filter>的形式. (有一個例外是broadcast receiver的intent filter是使用Context.registerReceiver()來動態設定的, 其intent filter也是在代碼中建立的.)
一個filter有action, data, category等欄位. 一個隱式intent為了能被某個intent filter接受, 必須通過3個測試. 一個intent為了被某個組件接受, 則必須通過它所有的intent filter中的一個.
Intent傳遞資料時,可以傳遞哪些類型資料?
Intent間傳送資料一般有兩種常用的辦法:
1.extra
2.data.
extra可以用Intent.putExtra放入資料。新啟動的Activity可用Intent.getExtras取出來Bundle, 然後用Bundles.getLong, getInt, getBoolean, getString等函數來取放進入的值。
而data則是傳輸url。url可以是指我們熟悉的http, ftp 等網路地址,也可以指content來指向ContentProvider提供的資源。Intent.setData可以放入資料,Intent.getData可以取出資料。
說說Activity,Intent,Service是什麼關係
一個Activity通常是一個單獨的螢幕,每一個Activity都被實現為一個單獨的類,這些類都是從Activity基類中繼承來的,Activity類會顯示由視圖控制群組成的使用者介面,並對視圖控制項的事件做出響應。
Intent的調用是用來進行架構螢幕之間的切換的。Intent是描述應用想要做什麼。Intent資料結構中兩個最重要的部分是動作和動作對應的資料,一個動作對應一個動作資料。
Android Service是運行在背景代碼,不能與使用者互動,可以運行在自己的進程,也可以運行在其他應用程式進程的上下文裡。需要通過某一個Activity或者其他Context對象來調用。
Activity跳轉到Activity,Activity啟動Service,Service開啟Activity都需要Intent表明跳轉的意圖,以及傳遞參數,Intent是這些組件間訊號傳遞的承載者。
請描述一下Broadcast Receiver
Broadcast Receiver用於接收並處理廣播通知(broadcast announcements)。多數的廣播是系統發起的,如地區變換、電量不足、來電來信等。程式也可以播放一個廣播。程式可以有任意數量的broadcast receivers來響應它覺得重要的通知。broadcast receiver可以通過多種方式通知使用者:啟動activity、使用NotificationManager、開啟背景燈、震動裝置、播放
聲音等,最典型的是在狀態列顯示一個表徵圖,這樣使用者就可以點它開啟看通知內容。通常我們的某個應用或系統本身在某些事件(電池電量不足、來電來簡訊)來臨時會廣播一個Intent出去,我們可以利用註冊一個Broadcast Receiver來監聽到這些Intent並擷取Intent中的資料。
在manifest和代碼中如何註冊和使用 broadcast receiver
1)在AndroidManifest.xml中註冊
<receiver android:name="Receiver1">
<intent-filter>
<!--和Intent中的action對應-->
<actionandroid:name="com.forrest.action.mybroadcast"/>
</intent-filter>
</receiver>
2)在代碼中註冊
1.IntentFilterfilter=newIntentFilter("com.forrest.action.mybroadcast");//和廣播中Intent的action對應
2.MyBroadcastReceiverbr=newMyBroadcastReceiver();
3. registerReceiver(newMyBroadcastReceiver(),filter);
請介紹下ContentProvider是如何?資料共用的
ContentProvider是通過提供Uri來實現資料共用
請介紹下Android的資料存放區方式
Android提供了5種方式儲存資料:使用SharedPreferences儲存資料;檔案儲存體資料;SQLite資料庫儲存資料;使用ContentProvider儲存資料;網路儲存資料;
為什麼要用ContentProvider?它和sql的實現上有什麼差別?
使用ContentProvider可以將資料共用給其他應用,讓除本應用之外的應用也可以訪問本應用的資料。它的底層是用SQLite資料庫實現的,所以其對資料做的各種操作都是以Sql實現,只是在上層提供的是Uri。
請介紹下Android中常用的五種布局
最常用的布局方式為LinearLayout、RelativeLayout、FrameLayout、TableLayout AbsoluteLayout。其中LinearLayout和RelativeLayout是最常用的方式,他們可以通過在xml設定檔或者代碼中進行布局
FrameLayout 最簡單的布局方式,放置的控制項都只能羅列到左上方,控制項會有重疊,不能進行複雜的布局。這個布局可以看成是牆腳堆東西,有一個四方的矩形的左上方牆腳,我們放了第一個東西,要再放一個,那就在放在原來放的位置的上面,這樣依次的放,會蓋住原來的東西。這個布局比較簡單,也只能放一點比較簡單的東西。
LinearLayou可以通過orientation屬性設定線性排列的方向是垂直(vertical)還是縱向(horizontal).每行或每列只有一個元素,可以進行複雜的布局。
AbsoluteLayout 可以讓子項目指定準確的x/y座標值,並顯示在螢幕上。AbsoluteLayout 沒有頁邊框,允許元素之間互相重疊(儘管不推薦)。他是絕對座標,所以在實際中不提倡使用。
RelativeLayout 允許子項目指定他們相對於其它元素或父元素的位置(通過ID 指定)。因此,你可以以靠右對齊,或上下,或置於螢幕中央的形式來排列兩個元素。元素按順序排列,因此如果第一個元素在螢幕的中央,那麼相對於這個元素的其它元素將以螢幕中央的相對位置來排列。這個是相對於AbsoluteLayout 的,採用的相對座標,所以在實際中比較常用。
TableLayout 將子項目的位置分配到行或列中。一個TableLayout 由許多的TableRow 組成,每個TableRow 都會定義一個row 。TableLayout 容器不會顯示row 、column或cell 的邊框線。每個row 擁有0個或多個的cell ;和html中的table差不多。在實際中也經常使用。
有的時候我們也會用到GridView,就像我們手機螢幕上擺放的各個表徵圖應該就是用GridView排版的。Padding是文字相對於邊框,而Margin是邊框相對於父表單。
談談UI中, Padding和Margin有什麼區別?
Padding是文字相對於邊框,而Margin是邊框相對於父表單。
AIDL的全稱是什嗎?如何工作?能處理哪些類型的資料?
AIDL是一種介面定義語言,用於約束兩個進程間的通訊規則,供編譯器產生代碼,實現Android裝置上的處理序間通訊。
進程之間的通訊資訊首先會被轉換成AIDL協議訊息,然後發送給對方,對方受到AIDL協議訊息後再轉換成相應的對象。
AIDL支援的類型包括Java基礎類型和String,List,Map,CharSequence,如果使用自訂類型,必須實現Parcelable介面。
請解釋下Android程式運行時許可權與檔案系統許可權的區別。
運行時Dalvik( android授權)
檔案系統linux 核心授權
如何載入的音樂資訊,如何改善其效率。
Android系統提供了MediaScanner,MediaProvider,MediaStore等介面,並且提供了一套資料庫表格,通過Content Provider的方式提供給使用者。當手機開機或者有SD卡插拔等事件發生時,系統將會自動掃描SD卡和手機記憶體上的媒體檔案,如audio,video,圖片等,將相應的資訊放到定義好的資料庫表格中。
改善效率可以從介面需要查詢必備資料,不需要的不進行查詢。
ListView如何提高其效率?
使用分頁載入,不要一次性載入所有資料
啟動一個程式,可以主介面點擊表徵圖進入,也可以從一個程式中跳轉過去,二者有什麼區別?
從主介面啟動一個應用程式是通過捷徑直接調用mainActivity啟動的,從其他應用程式調用需要隱式的通過Action或者在Intent中需要使用setClass(),且要寫明包路徑。
Android程式與Java程式的區別?
android程式是Java編寫的,但程式使用的android開發的API,就是andriod的庫。
談談對Android NDK的理解。
Android NDK是一套工具,允許Android應用開發人員嵌入從C、C++原始碼檔案編譯來的本地機器代碼到各自的應用軟體包中。
Android系統中GC什麼情況下會出現記憶體泄露呢?
出現情況:1. 資料庫的cursor沒有關閉2.構造adapter時,沒有使用緩衝contentview衍生listview的最佳化問題-----減少建立view的對象,充分使用contentview,可以使用一靜態類來最佳化處理getview的過程/3.Bitmap對象不使用時採用recycle()釋放記憶體4.activity中的對象的生命週期大於activity調試方法: DDMS==>HEAPSZIE==>dataobject==>[Total Size]
Android UI中的View如何重新整理。
一般只是希望在View發生改變時對UI進行重繪。你只需在Activity中顯式地調用View對象中的invalidate()方法即可。系統會自動調用View的onDraw()方法。
android中的動畫有哪幾類,它們的特點和區別是什嗎?
兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
動畫效果在anim目錄下的xml檔案中定義,在程式中用AnimationUtils.loadAnimation(Context context,int ResourcesId)載入成Animation對象,在需要顯示動畫效果時,執行需要動畫的View的startAnimation方法,傳入Animation,即可。切換Activity也可以應用動畫效果,在startActivity方法後,執行overridePendingTransition方法,兩個參數分別是切換前的動畫效果,切換後的動畫效果。
handler機制的原理。
Andriod提供了Handler和Looper來滿足線程間的通訊.Handler先進先出原則.Looper類用來管理特定線程內對象之間的訊息交換(Message Exchange)
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裡的Message Queue(訊息佇列).
2)Handler:你可以構造Handler對象來與Looper溝通,以便push新訊息到Message Queue裡;或者接收Looper從Message Queue取出)所送來的訊息.
3) Message Queue(訊息佇列):用來存放線程放入的訊息。
4)線程:UI thread 通常就是main thread,而Android啟動程式時會替它建立一個Message Queue。
android中線程與線程,進程與進程之間如何通訊
1、一個 Android 程式開始運行時,會單獨啟動一個Process。
預設情況下,所有這個程式中的Activity或者Service都會跑在這個Process。
預設情況下,一個Android程式也只有一個Process,但一個Process下卻可以有許多個Thread。
2、一個 Android 程式開始運行時,就有一個主線程Main Thread被建立。該線程主要負責UI介面的顯示、更新和控制項互動,所以又叫UI Thread。
一個Android程式建立之初,一個Process呈現的是單執行緒模式--即Main Thread,所有的任務都在一個線程中運行。所以,Main Thread所調用的每一個函數,其耗時應該越短越好。而對於比較費時的工作,應該設法交給子線程去做,以避免阻塞主線程(主線程被阻塞,會導致程式假死 現象)。
3、Android單執行緒模式:Android UI操作並不是安全執行緒的並且這些操作必須在UI線程中執行。如果在子線程中直接修改UI,會導致異常。
說說mvc模式的原理,它在android中的運用
MVC(Model_view_contraller)”模型_視圖_控制器”。MVC應用程式總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要Controller改變了Models的資料或者屬性,所有依賴的View都會自動更新。類似的,只要Contro
Android中各種介面的監聽操作就是MVC的應用。
如何將SQLite資料庫(dictionary.db檔案)與apk檔案一起發布?
可以將dictionary.db檔案複製到Eclipse Android工程中的res raw目錄中。所有在res raw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。可以將dictionary.db檔案複製到res raw目錄中
Android常用控制項的資訊
單選框(RadioButton與RadioGroup):
RadioGroup用於對單選框進行分組,相同組內的單選框只有一個單選框被選中。
事件:setOnCheckedChangeListener(),處理單選框被選擇事件。把RadioGroup.OnCheckedChangeListener執行個體作為參數傳入。
多選框(CheckBox):
每個多選框都是獨立的,可以通過迭代所有的多選框,然後根據其狀態是否被選中在擷取其值。
事件:setOnCheckedChangeListener(),處理多選框被選擇事件。把CheckBox.OnCheckedChangeListener()執行個體作為參數傳入。
下拉式清單方塊(Spinner):
Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());擷取下拉式清單方塊的值。
事件:setOnItemSelectedListener(),處理下拉式清單方塊被選擇事件把Spinner.OnItemSelectedListener()執行個體作為參數傳入。
拖動條(SeekBar):
SeekBar.getProgress()擷取拖動條當前值
事件:setOnSeekBarChangeListener(),處理拖動條值變化事件,把SeekBar.OnSeekBarChangeListener執行個體作為參數傳入。
菜單(Menu):
重寫Activity的onCreatOptionMenu(Menu menu)方法,該方法用於建立選項菜單,當使用者按下手機的"Menu"按鈕時就會顯示建立好的菜單,在onCreatOptionMenu(Menu Menu)方法內部可以調用Menu.add()方法實現菜單的添加。
重寫Activity的onMenuItemSelected()方法,該方法用於處理菜單被選擇事件。
進度對話方塊(ProgressDialog):
建立並顯示一個進度對話方塊:ProgressDialog.show(ProgressDialogActivity.this,"請稍等","資料正在載入中....",true);
設定對話方塊的風格:setProgressStyle()
ProgressDialog.STYLE_SPINNER 旋轉進度條風格(為預設風格)
ProgressDialog.STYLE_HORIZONTAL 橫向進度條風格
下面是各種常用控制項的事件監聽的使用
①EditText(編輯框)的事件監聽---OnKeyListener
②RadioGroup、RadioButton(選項按鈕)的事件監聽---OnCheckedChangeListener
③CheckBox(多選按鈕)的事件監聽---OnCheckedChangeListener
④Spinner(下拉式清單)的事件監聽---OnItemSelectedListener
⑤Menu(菜單)的事件處理---onMenuItemSelected
⑥Dialog(對話方塊)的事件監聽---DialogInterface.OnClickListener()