編輯:關於Android編程
請簡要介紹Android的四大組件。
答案:Android系統有四種組件,這四種組件構成了Android應用的框架,然後由Intent聯系這四種組件。
Android中Activity,Intent,ContentProvider,Service各有什麼區別。
答案:
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 注冊接受接受廣播的意圖 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。
singleTop 跟 standard 模式比較類似。唯一的區別就是,當跳轉的對象是位於 棧頂的 activity(應該可以理解為用戶眼前所 看到的 activity)時,程序將不會 生成一個新的 activity 實例,而是直接跳到現存於棧頂的那個 activity 實例。拿 上面的例子來說,當 Act1 為 singleTop 模式時,執行跳轉後棧裡面依舊只有
一個實例,如果現在按返回鍵程序將直接退出。
singleTask 模式和 singleInstance 模式都是只創建一個實例的。在這種模
式下,無論跳轉的對象是不是位於棧頂的 activity,程序都不會生成一個新的實 例(當然前提是棧裡面已經有這個實例)。這種模式相當有用,在以後的多 activity 開發中,常會因為跳轉的關系導致同個頁面生成多個實例,這個在用戶體驗上始 終有點不好,而如果你將對應的 activity 聲明為 singleTask 模式,這種問題將 不復存在。在主頁的 Activity 很常用
避免非靜態的內部類,盡量使用靜態類,避免生命周期問題,注意內部類 對外部對象引用導致的生命周期變化。
Context 是什麼?
1、它描述的是一個應用程序環境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實 現類(ContextIml)。
3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作, 例如:啟動一個 Activity,發送廣播,接受 Intent,信息,等。
附加一張Context繼承關系圖
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 的時候,小心內存洩露,防止內存洩露,注意一下幾個方面:
Context 是什麼?
1、它描述的是一個應用程序環境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實 現類(ContextIml)。
3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作, 例如:啟動一個 Activity,發送廣播,接受 Intent,信息,等。
附加一張Context繼承關系圖
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過濾器)。
我們有一個TextView,其裡面的內容是可以通過代碼動態改變的,我們想用一張圖片作為TextView的背景,實現類似於手機QQ對話中的氣泡文本效果。TextView定義
Android打包apk時,有時候需要打各種渠道包,例如 豌豆莢、華為手機市場、小米市場、360市場等,那麼每一種渠道打包時,都需要配置不同的數據元,如果渠道較多,那麼打
Android Fragment(動態,靜態)碎片詳解一.Fragment的相關概念(一)Fragment的基礎知識 &nb
筆者有一段時間沒有發表關於Android的文章了,關於Android自定義組件筆者有好幾篇想跟大家分享的,後期會記錄在博客中。本篇博客給大家分享的是自定義一個日期選擇器,