編輯:關於Android編程
<manifest ...="">
...
</activity></application>
...
</manifest>
您還可以在此元素中加入幾個其他特性,以定義 Activity 標簽、Activity 圖標或風格主題等用於設置 Activity UI 風格的屬性。android:name 特性是唯一的必需特性—它指定 Activity 的類名。應用一旦發布,即不應更改此類名,否則,可能會破壞諸如應用快捷方式等一些功能。
<intent-filter>
<category android:name="android.intent.category.LAUNCHER">
</category></action></intent-filter>
</activity>
action元素指定這是應用的“main”入口點。category元素指定此 Activity 應列入系統的應用啟動器內(以便用戶啟動該 Activity)。 如果您打算讓應用成為獨立應用,不允許其他應用激活其 Activity,則您不需要任何其他 Intent 過濾器。 正如前例所示,只應有一個 Activity 具有“主”操作和“launcher”類別。您不想提供給其他應用的 Activity 不應有任何 Intent 過濾器,您可以利用顯式 Intent 自行啟動它們。 不過,如果您想讓 Activity 對衍生自其他應用(以及您的自有應用)的隱式 Intent 作出響應,則必須為 Activity 定義其他 Intent 過濾器。 對於您想要作出響應的每一個 Intent 類型,您都必須加入相應的Intent-filter,其中包括一個action元素,還可選擇性地包括一個category元素和/或一個data元素。這些元素指定您的 Activity 可以響應的 Intent 類型。
Intent intent = new Intent(this, SignInActivity.class); startActivity(intent);不過,您的應用可能還需要利用您的 Activity 數據執行某項操作,例如發送電子郵件、短信或狀態更新。 在這種情況下,您的應用自身可能不具有執行此類操作所需的 Activity,因此您可以改為利用設備上其他應用提供的 Activity 為您執行這些操作。這便是Intent 對象的真正價值所在—您可以創建一個 Intent 對象,對您想執行的操作進行描述,系統會從其他應用啟動相應的 Activity。如果有多個Activity 可以處理 Intent,則用戶可以選擇要使用哪一個。 例如,如果您想允許用戶發送電子郵件,可以創建以下 Intent 對象:
Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent);添加到 Intent 中的 EXTRA_EMAIL extra 是一個字符串數組,其中包含應將電子郵件發送到的電子郵件地址。 當電子郵件應用響應此 Intent 時,它會讀取 extra 中提供的字符串數組,並將它們放入電子郵件撰寫窗體的“收件人”字段。 在這種情況下,電子郵件應用的 Activity 啟動,並且當用戶完成操作時,您的 Activity 會恢復執行。
private void pickContact() {
// Create an intent to "pick" a contact, as defined by the content provider URI
Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// If the request went well (OK) and the request was PICK_CONTACT_REQUEST
if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
// Perform a query to the contact's content provider for the contact's name
Cursor cursor = getContentResolver().query(data.getData(),
new String[] {Contacts.DISPLAY_NAME}, null, null, null);
if (cursor.moveToFirst()) { // True if the cursor is not empty
int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
String name = cursor.getString(columnIndex);
// Do something with the selected contact's name...
}
}
}
上例顯示的是,您在處理 Activity 結果時應該在 onActivityResult() 方法中使用的基本邏輯。第一個條件檢查請求是否成功(如果成功,則resultCode 將為 RESULT_OK)以及此結果響應的請求是否已知 — 在此情況下,requestCode與隨 startActivityForResult() 發送的第二個參數匹配。 代碼通過查詢 Intent 中返回的數據(data 參數)從該處開始處理 Activity 結果。
實際情況是,ContentResolver 對一個內容提供程序執行查詢,後者返回一個 Cursor,讓查詢的數據能夠被讀取。
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
}
注:正如以上示例所示,您在實現這些生命周期方法時必須始終先調用超類實現,然後再執行任何操作。
這些方法共同定義 Activity 的整個生命周期。您可以通過實現這些方法監控 Activity 生命周期中的三個嵌套循環:
(1)Activity 的整個生命周期發生在 onCreate() 調用與 onDestroy() 調用之間。您的 Activity 應在 onCreate() 中執行“全局”狀態設置(例如定義布局),並釋放 onDestroy() 中的所有其余資源。例如,如果您的 Activity 有一個在後台運行的線程,用於從網絡上下載數據,它可能會在 onCreate() 中創建該線程,然後在 onDestroy() 中停止該線程。
圖1.Activity的生命周期
圖 1 說明了這些循環以及 Activity 在狀態轉變期間可能經過的路徑。矩形表示回調方法,當 Activity 在不同狀態之間轉變時,您可以實現這些方法來執行操作。
表 1. Activity 生命周期回調方法匯總表
表 1 列出了相同的生命周期回調方法,其中對每一種回調方法做了更詳細的描述,並說明了每一種方法在 Activity 整個生命周期內的位置,包括在回調方法完成後系統能否終止 Activity。
名為“是否能事後終止?”的列表示系統是否能在不執行另一行 Activity 代碼的情況下,在方法返回後隨時終止承載 Activity 的進程。 有三個方法帶有“是”標記:(onPause()、onStop() 和 onDestroy())。由於 onPause() 是這三個方法中的第一個,因此 Activity 創建後,onPause() 必定成為最後調用的方法,然後才能終止進程—如果系統在緊急情況下必須恢復內存,則可能不會調用 onStop() 和 onDestroy()。因此,您應該使用 onPause() 向存儲設備寫入至關重要的持久性數據(例如用戶編輯)。不過,您應該對 onPause() 調用期間必須保留的信息有所選擇,因為該方法中的任何阻止過程都會妨礙向下一個 Activity 的轉變並拖慢用戶體驗。
在是否能在事後終止?列中標記為“否”的方法可從系統調用它們的一刻起防止承載 Activity 的進程被終止。 因此,在從 onPause() 返回的時間到 onResume() 被調用的時間,系統可以終止 Activity。在 onPause() 被再次調用並返回前,將無法再次終止 Activity。
注:根據表 1 中的定義屬於技術上無法“終止”的 Activity 仍可能被系統終止—但這種情況只有在無任何其他資源的極端情況下才會發生。進程和線程處理文檔對可能會終止 Activity 的情況做了更詳盡的闡述。
圖2.Activity狀態的保存
圖 2. 在兩種情況下,Activity 重獲用戶焦點時可保持狀態完好:系統在銷毀 Activity 後重建 Activity,Activity 必須恢復之前保存的狀態;系統停止 Activity 後繼續執行 Activity,並且 Activity狀態保持完好。
注:無法保證系統會在銷毀您的 Activity 前調用 onSaveInstanceState(),因為存在不需要保存狀態的情況(例如用戶使用“返回” 按鈕離開您的 Activity 時,因為用戶的行為是在顯式關閉 Activity)。如果系統調用 onSaveInstanceState(),它會在調用 onStop() 之前,並且可能會在調用 onPause() 之前進行調用。
不過,即使您什麼都不做,也不實現 onSaveInstanceState(),Activity 類的 onSaveInstanceState() 默認實現也會恢復部分 Activity 狀態。具體地講,默認實現會為布局中的每個 View 調用相應的onSaveInstanceState() 方法,讓每個視圖都能提供有關自身的應保存信息。Android 框架中幾乎每個小工具都會根據需要實現此方法,以便在重建 Activity 時自動保存和恢復對 UI 所做的任何可見更改。例如,EditText 小工具保存用戶輸入的任何文本,CheckBox 小工具保存復選框的選中或未選中狀態。您只需為想要保存其狀態的每個小工具提供一個唯一的 ID(通過 android:id 屬性)。如果小工具沒有 ID,則系統無法保存其狀態。
盡管 onSaveInstanceState() 的默認實現會保存有關您的Activity UI 的有用信息,您可能仍需替代它以保存更多信息。例如,您可能需要保存在 Activity 生命周期內發生了變化的成員值(它們可能與UI 中恢復的值有關聯,但默認情況下系統不會恢復儲存這些 UI 值的成員)。
由於 onSaveInstanceState() 的默認實現有助於保存 UI 的狀態, 因此如果您為了保存更多狀態信息而重寫該方法,應始終先調用 onSaveInstanceState() 的超類實現,然後再執行任何操作。同樣,如果您替代 onRestoreInstanceState() 方法,也應調用它的超類實現,以便默認實現能夠恢復視圖狀態。
您還可以通過將 android:saveEnabled 屬性設置為 "false" 或通過調用 setSaveEnabled() 方法顯式阻止布局內的視圖保存其狀態。您通常不應將該屬性禁用,但如果您想以不同方式恢復 Activity UI的狀態,就可能需要這樣做。
您只需旋轉設備,讓屏幕方向發生變化,就能有效地測試您的應用的狀態恢復能力。當屏幕方向變化時,系統會銷毀並重Activity,以便應用可供新屏幕配置使用的備用資源。 單憑這一理由,您的 Activity 在重建時能否完全恢復其狀態就顯得非常重要,因為用戶在使用應用時經常需要旋轉屏幕。
Android自定義控件---“取消”視圖
一、前言好久沒更新博客了,最近一直在忙,找實習,整理畢業資料,找房子等等。現在大部分基本忙完了,這幾天在公司寫的一些自定義控件,打算發出來與大家分享。 首先看看
Android學習教程之懸浮窗菜單制作(9)
本文實例為大家分享了Android懸浮窗菜單的具體代碼,供大家參考,具體內容如下MainActivity.java代碼:package siso.multilistvie
《Android源碼設計模式解析與實戰》讀書筆記(二十二)
第二十二章、享元模式 享元模式是結構型設計模式之一,是對對象池的一種實現。就像它的名字一樣,共享對象,避免重復的創建。我們常用的String 就是使用了共享模式,所以St
android事件分發源碼解析(上)
一 前言??把android開發藝術探索第三章閱讀了,對事件分發機制有一個大概的了解,關於事件分發的文章也很多,自己也看了一些相關的文章,決定自己分析一遍記錄下來,加深映