Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 面試題總結之Android 基礎(一)

Android 面試題總結之Android 基礎(一)

編輯:關於Android編程

Android四大組件簡介

請簡要介紹Android的四大組件。
答案:Android系統有四種組件,這四種組件構成了Android應用的框架,然後由Intent聯系這四種組件。

Activity用來顯示Android的程序界面,一個應用往往有多個界面,所以一個應用中會有多個Activity。 Service沒有界面的後台服務,會一直運行在後台。常被用來做數據處理,也可以做一些定時的任務。 Broadcast Receiver是Android的廣播接收器,在廣播機制中充當廣播的接受者的作用,Android中充滿了各種廣播,所有需要有選擇地接收一些有用的廣播,然後處理這些廣播。 Content Provider可直譯為內容提供者,它是用在不同的應用程序之間共享數據時,可以把一個應用的數據提供給其他的應用使用。

Android中Activity,Intent,ContentProvider,Service各有什麼區別。
答案:

Activity:活動,是最基本的android應用程序組件。一個活動就是一個單獨的屏幕,每一個活動都被實現為一個獨立的類,並且從活動基類繼承而來。 Intent:意圖,描述應用想干什麼。最重要的部分是動作和動作對應的數據。 ContentProvider:內容提供器,android應用程序能夠將它們的數據保存到文件、SQLite數據庫中,甚至是任何有效的設備中。當你想將你的應用數據和其他應用共享時,內容提供器就可以發揮作用了。 Service:服務,具有一段較長生命周期且沒有用戶界面的程序。 Manifest.xml文件中主要包括哪些信息?
答案:manifest:根節點,描述了package中所有的內容。
uses-permission:請求你的package正常運作所需賦予的安全許可。 permission:聲明了安全許可來限制哪些程序能你package中的組件和功能。 instrumentation:聲明了用來測試此package或其他package指令組件的代碼。 application:包含package中application級別組件聲明的根節點。 activity:Activity是用來與用戶交互的主要工具。 receiver:IntentReceiver能使的application獲得數據的改變或者發生的操作,即使它當前不在運行。 service:Service是能在後台運行任意時間的組件。 provider:ContentProvider是用來管理持久化數據並發布給其他應用程序使用的組件。

Activity

什麼是 Activity?
四大組件之一,一個用戶交互界面對應一個 activity setContentView() ,// 要顯示的布局 button.setOnclickLinstener{
}, activity 是 Context 的子類,同時實現了 window.callback 和 keyevent.callback, 可以處理與窗體用戶交互的事件. 我開發常用的的有
FragmentActivitiyListActivity ,PreferenceActivity ,TabAcitivty 等…

Activity 生命周期
Activity 從創建到銷毀有多種狀態,從一種狀態到另一種狀態時會激發相應 的回調方法,這些回調方法包括:onCreate onStart onResume onPause onStop onDestroy

其實這些方法都是兩兩對應的,onCreate 創建與 onDestroy 銷毀;
onStart 可見與 onStop 不可見;onResume 可編輯(即焦點)與 onPause;
如果界面有共同的特點或者功能的時候,還會自己定義一個 BaseActivity. 進度對話框的顯示與銷毀
onCreate Activity 創建時的初始化工作 如設置頁面的ContentView、接收參數等.

onRestart 在Activity的onStop後重新啟動時,會調用這個參數

onStart 正在啟動,即將開始,沒有出現在前台,還無法和用戶交互,可以理解為已經初始化完成,但是處於後台我們暫時沒法看見。

onResume 可見了並且處於激活態,處於前台。

和onStart最大的不同就是onStart是在後台已經初始化完,但是無法交互。

onPause 失去焦點不可以交互、處於後台。

onStop 即將停止,做一些稍微重量級回收類的工作

onDestory Activity即將被銷毀,需要們做一些回收和資源釋放類的工作。

提醒: 從Activity A,打開另一個Activity B,B這個Activity是在A的onPause執行後才變成可見狀態的,所以為了不影響B的顯示,最好不要在onPause裡執行一些耗時操作,可以考慮將這些操作放到onStop裡,這時B已經可見了,(意思是A ->onPause 後才 B->onCreate,onStart, onResume #轉問題4)

這裡寫圖片描述

如何保存 Activity 的狀態?
Activity 的狀態通常情況下系統會自動保存的,只有當我們需要保存額外的 數據時才需要使用到這樣的功能。
一般來說, 調用 onPause()和 onStop()方法後的 activity 實例仍然存在於內 存中, activity 的所有信息和狀態數據不會消失, 當 activity 重新回到前台之後, 所有的改變都會得到保留。
但是當系統內存不足時, 調用 onPause()和 onStop()方法後的 activity 可能 會被系統摧毀, 此時內存中就不會存有該 activity 的實例對象了。如果之後這個 activity 重新回到前台, 之前所作的改變就會消失。為了避免此種情況的發生, 我 們可以覆寫 onSaveInstanceState()方法。
onSaveInstanceState()方法接受一 個 Bundle 類型的參數, 開發者可以將狀態數據存儲到這個 Bundle 對象中, 這 樣即使 activity 被系統摧毀, 當用戶重新啟動這個 activity 而調用它的
onCreate()方法時, 上述的 Bundle 對象會作為實參傳遞給 onCreate()方法, 開 發者可以從 Bundle 對象中取出保存的數據, 然後利用這些數據將 activity 恢復 到被摧毀之前的狀態。
需要注意的是, onSaveInstanceState()方法並不是一定會被調用的, 因為有 些場景是不需要保存狀態數據的. 比如用戶按下 BACK 鍵退出 activity 時, 用戶 顯然想要關閉這個 activity, 此時是沒有必要保存數據以供下次恢復的, 也就是 onSaveInstanceState()方法不會被調用.
如果調用 onSaveInstanceState()方 法, 調用將發生在 onPause()或 onStZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcCgpt723qNaux7ChozwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); } 兩個 Activity 之間跳轉時必然會執行的是哪幾個方 法?
一般情況下比如說有兩個 activity,分別叫 A,B,當在 A 裡面激活 B 組件的時候, A 會調用 onPause()方法,然後 B 調用 onCreate() ,onStart(), onResume()。
這個時候 B 覆蓋了窗體, A 會調用 onStop()方法. 如果 B 是個透明的,或者 是對話框的樣式, 就不會調用 A 的 onStop()方法。橫豎屏切換時 Activity 的生命周期
此時的生命周期跟清單文件裡的配置有關系。
1.不設置 Activity 的 android:configChanges 時,切屏會重新調用各個生命周期默認首先銷毀當前 activity,然後重新加載。 2.設置 Activity
android:configChanges=”orientation|keyboardHidden|screenSize”時,切 屏不會重新調用各個生命周期,只會執行 onConfigurationChanged 方法。
通常在游戲開發, 屏幕的朝向都是寫死的。如何將一個 Activity 設置成窗口的樣式 只需要給我們的 Activity 配置如下屬性即可。

```
7. 如何退出 Activity?如何安全退出已調用多個 Activity 的 Application?   
  1. 通常情況用戶退出一個 Activity 只需按返回鍵,我們寫代碼想退出 activity 直接調用 finish()方法就行。
  2. 記錄打開的 Activity:
每打開一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。
//偽代碼
```List lists ;// 在 application 全局的變量裡面 lists = new ArrayList();
lists.add(this);
for(Activity activity: lists)
{
           activity.finish();
        }
lists.remove(this); 
發送特定廣播:
在需要結束應用時,發送一個特定的廣播,每個 Activity 收到廣播後,關閉 即可。
//給某個 activity 注冊接受接受廣播的意圖 registerReceiver(receiver, filter)
//如果過接受到的是 關閉 activity 的廣播 activity finish()掉

遞歸退出
就調用 finish()方法 把當前的
在打開新的 Activity 時使用 startActivityForResult,然後自己加標志,在 onActivityResult 中處理,遞歸關閉。
5、其實 也可以通過 intent 的 flag 來實現 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的 activity。 此時如果該任務棧中已經有該 Activity,那麼系統會把這個 Activity 上面的所有 Activity 干掉。其實相當於給 Activity 配置的啟動模式為 SingleTop。

Activity 的四種啟動模式,singletop 和 singletask 區別是什麼?一般書簽的使用模式是 singletop,那為什麼 不使用 singletask?

singleTop 跟 standard 模式比較類似。唯一的區別就是,當跳轉的對象是位於 棧頂的 activity(應該可以理解為用戶眼前所 看到的 activity)時,程序將不會 生成一個新的 activity 實例,而是直接跳到現存於棧頂的那個 activity 實例。拿 上面的例子來說,當 Act1 為 singleTop 模式時,執行跳轉後棧裡面依舊只有

一個實例,如果現在按返回鍵程序將直接退出。
singleTask 模式和 singleInstance 模式都是只創建一個實例的。在這種模
式下,無論跳轉的對象是不是位於棧頂的 activity,程序都不會生成一個新的實 例(當然前提是棧裡面已經有這個實例)。這種模式相當有用,在以後的多 activity 開發中,常會因為跳轉的關系導致同個頁面生成多個實例,這個在用戶體驗上始 終有點不好,而如果你將對應的 activity 聲明為 singleTask 模式,這種問題將 不復存在。在主頁的 Activity 很常用

Android 中的 Context, Activity,Appliction 有 什麼區別?
相同:Activity 和 Application 都是 Context 的子類。
Context 從字面上理解就是上下文的意思,在實際應用中它也確實是起到了管理 上下文環境中各個參數和變量的總用,方便我們可以簡單的訪問到各種資源。
不同:維護的生命周期不同。Context 維護的是當前的 Activity 的生命周期, Application 維護的是整個項目的生命周期。使用 context 的時候,小心內存洩露,防止內存洩露,注意一下幾個方面: 不要讓生命周期長的對象引用 activity context,即保證引用 activity 的對 象要與 activity 本身生命周期是一樣的。對於生命周期長的對象,可以使用 application,context。

避免非靜態的內部類,盡量使用靜態類,避免生命周期問題,注意內部類 對外部對象引用導致的生命周期變化。

Context 是什麼?
1、它描述的是一個應用程序環境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實 現類(ContextIml)。
3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作, 例如:啟動一個 Activity,發送廣播,接受 Intent,信息,等。

附加一張Context繼承關系圖
這裡寫圖片描述

Intent 詳解

AndroidIntent的使用
三大組件——Activity、Service和Broadcast Receiver都是被什麼激活的?
答案:Intent是一種運行時綁定的消息機制,而三大組件——Activity、Service和Broadcast Receiver都是被消息激活的,這種消息就是Intent。
一個Intent對象包括六個屬性,請一一列舉這六個屬性。
答案:組件名(Component Name)、動作(Action)、數據(Data)、分類(Category)、額外信息(Extra)和標志(Flags)。

答案:在一個Android應用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通訊中,由Intent協助完成。
正如網上一些人解析所說,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將Intent傳遞給調用的組件,並完成組件的調用。Intent在這裡起著實現調用者與被調用者之間的解耦作用。
Intent傳遞過程中,要找到目標消費者(另一個Activity,IntentReceiver或Service),也就是Intent的響應者,有兩種方法來匹配:

1、顯示匹配(Explicit):
publicTestBextentsActivity
{
.........
};
publicclassTestextendsActivity
{
......
publicvoidswitchActivity()
{
Intenti=newIntent(Test.this,TestB.class);
this.startActivity(i);
}
}


代碼簡潔明了,執行了switchActivity()函數,就會馬上跳轉到名為TestB的Activity中。

2、隱式匹配(Implicit):

隱式匹配,首先要匹配Intent的幾項值:Action,Category,Data/Type,Component
如果填寫了Componet就是上例中的Test.class)這就形成了顯示匹配。所以此部分只講前幾種匹配。匹配規則為最大匹配規則,

1、如果你填寫了Action,如果有一個程序的Manifest.xml中的某一個Activity的IntentFilter段中定義了包含了相同的Action那麼這個Intent就與這個目標Action匹配,如果這個Filter段中沒有定義Type,Category,那麼這個Activity就匹配了。但是如果手機中有兩個以上的程序匹配,那麼就會彈出一個對話可框來提示說明。
Action的值在Android中有很多預定義,如果你想直接轉到你自己定義的Intent接收者,你可以在接收者的IntentFilter中加入一個自定義的Action值(同時要設定Category值為”android.intent.category.DEFAULT”),在你的Intent中設定該值為Intent的Action,就直接能跳轉到你自己的Intent接收者中。因為這個Action在系統中是唯一的。
2、data/type,你可以用Uri來做為data,比如Uriuri=Uri.parse(http://www.google.com);
Intenti=newIntent(Intent.ACTION_VIEW,uri);手機的Intent分發過程中,會根據http://www.google.com的scheme判斷出數據類型type
手機的Brower則能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEWAction,也能處理http:的type,

3、至於分類Category,一般不要去在Intent中設置它,如果你寫Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,這樣所有不設置Category(Intent.addCategory(Stringc);)的Intent都會與這個Category匹配。

4、extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,比如,如果要執行“發送電子郵件”這個動作,可以將電子郵件的標題、正文等保存在extras裡,傳給電子郵件發送組件。

IntentFilter(Intent過濾器)
為什麼要引入IntentFilter?
答案:對於顯式Intent,它的接受者已被指定,所以系統會自動把這個Intent發給指定的組件。但是對於隱式Intent,由於並沒有指定其組件名屬性,所以系統不知道該把它發給哪個組件名,於是系統就直接將其發出去,算是所有的組件都有權接收,這就需要定義一個組件可以接收到哪些Intent,所以就引入了IntentFilter(Intent過濾器)。

``
3. 發送特定廣播:
在需要結束應用時,發送一個特定的廣播,每個 Activity 收到廣播後,關閉 即可。

//給某個 activity 注冊接受接受廣播的意圖 registerReceiver(receiver, filter)
//如果過接受到的是 關閉 activity 的廣播 activity finish()掉`
4. 遞歸退出
就調用 finish()方法 把當前的
在打開新的 Activity 時使用 startActivityForResult,然後自己加標志,在 onActivityResult 中處理,遞歸關閉。
5、其實 也可以通過 intent 的 flag 來實現 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的 activity。 此時如果該任務棧中已經有該 Activity,那麼系統會把這個 Activity 上面的所有 Activity 干掉。其實相當於給 Activity 配置的啟動模式為 SingleTop。

Activity 的四種啟動模式,singletop 和 singletask 區別是什麼?一般書簽的使用模式是 singletop,那為什麼 不使用 singletask?

singleTop 跟 standard 模式比較類似。唯一的區別就是,當跳轉的對象是位於 棧頂的 activity(應該可以理解為用戶眼前所 看到的 activity)時,程序將不會 生成一個新的 activity 實例,而是直接跳到現存於棧頂的那個 activity 實例。拿 上面的例子來說,當 Act1 為 singleTop 模式時,執行跳轉後棧裡面依舊只有

一個實例,如果現在按返回鍵程序將直接退出。
singleTask 模式和 singleInstance 模式都是只創建一個實例的。在這種模
式下,無論跳轉的對象是不是位於棧頂的 activity,程序都不會生成一個新的實 例(當然前提是棧裡面已經有這個實例)。這種模式相當有用,在以後的多 activity 開發中,常會因為跳轉的關系導致同個頁面生成多個實例,這個在用戶體驗上始 終有點不好,而如果你將對應的 activity 聲明為 singleTask 模式,這種問題將 不復存在。在主頁的 Activity 很常用

Android 中的 Context, Activity,Appliction 有 什麼區別?

相同:Activity 和 Application 都是 Context 的子類。
Context 從字面上理解就是上下文的意思,在實際應用中它也確實是起到了管理 上下文環境中各個參數和變量的總用,方便我們可以簡單的訪問到各種資源。
不同:維護的生命周期不同。Context 維護的是當前的 Activity 的生命周期, Application 維護的是整個項目的生命周期。使用 context 的時候,小心內存洩露,防止內存洩露,注意一下幾個方面:

不要讓生命周期長的對象引用 activity context,即保證引用 activity 的對 象要與 activity 本身生命周期是一樣的。對於生命周期長的對象,可以使用 application,context。避免非靜態的內部類,盡量使用靜態類,避免生命周期問題,注意內部類 對外部對象引用導致的生命周期變化。

Context 是什麼?

1、它描述的是一個應用程序環境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實 現類(ContextIml)。
3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作, 例如:啟動一個 Activity,發送廣播,接受 Intent,信息,等。

附加一張Context繼承關系圖
這裡寫圖片描述

Intent 詳解

AndroidIntent的使用
三大組件——Activity、Service和Broadcast Receiver都是被什麼激活的?
答案:Intent是一種運行時綁定的消息機制,而三大組件——Activity、Service和Broadcast Receiver都是被消息激活的,這種消息就是Intent。
一個Intent對象包括六個屬性,請一一列舉這六個屬性。
答案:組件名(Component Name)、動作(Action)、數據(Data)、分類(Category)、額外信息(Extra)和標志(Flags)。

答案:在一個Android應用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通訊中,由Intent協助完成。
正如網上一些人解析所說,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將Intent傳遞給調用的組件,並完成組件的調用。Intent在這裡起著實現調用者與被調用者之間的解耦作用。
Intent傳遞過程中,要找到目標消費者(另一個Activity,IntentReceiver或Service),也就是Intent的響應者,有兩種方法來匹配:

1、顯示匹配(Explicit):
publicTestBextentsActivity
{
.........
};
publicclassTestextendsActivity
{
......
publicvoidswitchActivity()
{
Intenti=newIntent(Test.this,TestB.class);
this.startActivity(i);
}
}


代碼簡潔明了,執行了switchActivity()函數,就會馬上跳轉到名為TestB的Activity中。

2、隱式匹配(Implicit):

隱式匹配,首先要匹配Intent的幾項值:Action,Category,Data/Type,Component
如果填寫了Componet就是上例中的Test.class)這就形成了顯示匹配。所以此部分只講前幾種匹配。匹配規則為最大匹配規則,

1、如果你填寫了Action,如果有一個程序的Manifest.xml中的某一個Activity的IntentFilter段中定義了包含了相同的Action那麼這個Intent就與這個目標Action匹配,如果這個Filter段中沒有定義Type,Category,那麼這個Activity就匹配了。但是如果手機中有兩個以上的程序匹配,那麼就會彈出一個對話可框來提示說明。
Action的值在Android中有很多預定義,如果你想直接轉到你自己定義的Intent接收者,你可以在接收者的IntentFilter中加入一個自定義的Action值(同時要設定Category值為”android.intent.category.DEFAULT”),在你的Intent中設定該值為Intent的Action,就直接能跳轉到你自己的Intent接收者中。因為這個Action在系統中是唯一的。
2、data/type,你可以用Uri來做為data,比如Uriuri=Uri.parse(http://www.google.com);
Intenti=newIntent(Intent.ACTION_VIEW,uri);手機的Intent分發過程中,會根據http://www.google.com的scheme判斷出數據類型type
手機的Brower則能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEWAction,也能處理http:的type,

3、至於分類Category,一般不要去在Intent中設置它,如果你寫Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,這樣所有不設置Category(Intent.addCategory(Stringc);)的Intent都會與這個Category匹配。

4、extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,比如,如果要執行“發送電子郵件”這個動作,可以將電子郵件的標題、正文等保存在extras裡,傳給電子郵件發送組件。

IntentFilter(Intent過濾器)
為什麼要引入IntentFilter?
答案:對於顯式Intent,它的接受者已被指定,所以系統會自動把這個Intent發給指定的組件。但是對於隱式Intent,由於並沒有指定其組件名屬性,所以系統不知道該把它發給哪個組件名,於是系統就直接將其發出去,算是所有的組件都有權接收,這就需要定義一個組件可以接收到哪些Intent,所以就引入了IntentFilter(Intent過濾器)。

   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved