編輯:關於Android編程
我們的app的功能可能對別的app也有用,那麼我們的app應該做好響應其他APP的准備。
例如,一個社交app,它可以分享信息或者照片給好友,那麼最好我們的app能夠接收ACTION_SEND
的intent,這樣當用戶在其他app觸發分享功能的時候,我們的app也能夠出現在待選對話框。
通過在manifest文件中的標簽下添加
屬性,能使其他的app能夠啟動我們的activity。
當app被安裝到設備上時,系統可以識別intent filter並把這些信息記錄下來。
當其他app使用隱式intent執行startActivity()
或者startActivityForResult()
時,系統會自動查找出那些可以響應該intent的activity。
為了盡可能確切的定義activity能夠處理的intent,每一個intent filter都應該盡可能詳盡的定義好action元素與data元素。
若activity中的intent filter滿足以下intent對象的標准,系統就能夠把特定的intent發送給activity:
Action:一個想要執行的動作的名稱。
通常是系統已經定義好的值,如ACTION_SEND或ACTION_VIEW。 在intent filter中通過指定它的值,值的類型必須為字符串,而不是API中的常量(看下面的例子)
Data:Intent附帶數據的描述。
在intent filter中通過指定它的值,可以使用一個或者多個屬性,我們可以只定義MIME type或者是只指定URI prefix,也可以只定義一個URI scheme,或者是他們綜合使用。
Category:提供一個附加的方法來標識這個activity能夠處理的intent。Note: 如果不想處理Uri類型的數據,那麼應該指定 android:mimeType 屬性。例如
text/plain
orimage/jpeg
.
在我們APP的intent filter中,可以在元素中定義對應的XML元素來聲明我們的activity使用何種標准。
例如,這個有intent filter的activity,當數據類型為文本或圖像時會處理ACTION_SEND
的intent。
又如,通過配置文件中的intent過濾器設置,activity會對外宣稱自己是適合處理ACTION_VIEW
的activity。
如果是開發一款浏覽器應用,為響應ACTION_VIEW
操作,需要在activity聲明中包含以下intent過濾器:
intent過濾器中的action元素告訴操作系統,activity能夠處理指定的任務;
DEFAULT類別告訴操作系統,activity願意處理某項任務。
DEFAULT類別必須明確地在intent過濾器中進行設置。
如果沒有在的intent filter中聲明CATEGORY_DEFAULT,activity將無法對implicit intent做出響應。
DEFAULT類別實際隱含添加到了幾乎每一個隱式intent中。(唯一的例外是LAUNCHER類別,因為他是所有應用的主activity都會響應的隱式intent,並且要帶有MAIN的action)。
每一個發出去的intent只會包含一個action與data類型,但處理這個intent的activity的 可以聲明多個, 與 。
如果任何的兩對action與data是互相矛盾的,就應該創建不同的intent filter來指定特定的action與type。
例如,假設我們的activity可以處理文本與圖片,無論是ACTION_SEND
還是ACTION_SENDTO
的intent。在這種情況下,就必須為兩個action定義兩個不同的intent filter。因為ACTION_SENDTO的intent 必須使用 Uri 類型來指定接收者使用 send 或 sendto 的地址。例子:
為了決定采用哪個action,我們可以讀取Intent的內容。
可以執行getIntent()
來獲取啟動我們的activity的那個intent。我們可以在activity生命周期的任何時候去執行這個方法,但最好是在onCreate()
或者onStart()
裡面去執行。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 獲得啟動當前activity的intent
Intent intent = getIntent();
Uri data = intent.getData();
// 計算出intent的type
if (intent.getType().indexOf(image/) != -1) {
// 處理intent的類型是圖像的數據 ...
} else if (intent.getType().equals(text/plain)) {
// 處理intent的類型是文本的數據 ...
}
}
如果想返回一個result給啟動我們的activity的那個activity,僅僅需要執行setResult()
,通過指定一個result code與result intent。操作完成之後,用戶需要返回到原來的activity,通過執行finish() 關閉被喚起的activity。
// 創建Intent來提供某種形式的結果數據
Intent result = new Intent(com.example.RESULT_ACTION, Uri.parse(content://result_uri);
setResult(Activity.RESULT_OK, result);
finish();
我們必須總是指定一個result code。通常不是RESULT_OK
就是RESULT_CANCELED
。我們可以通過Intent來添加需要返回的數據。
Note:默認的result code是
RESULT_CANCELED
.因此,如果用戶在沒有完成操作之前點擊了返回鍵,那麼之前的activity接受到的result code就是”canceled”。
如果只是純粹想要返回一個整數來表示結果的選項之一,則可以設置result code為任何大於0的數值。
如果我們返回的result只是一個整數,那麼連intent都可以不需要返回了,可以調用setResult(int)
然後只傳遞result code如下:
setResult(RESULT_COLOR_RED);
finish();
Note:我們沒有必要在意自己的activity是被用
startActivity()
還是startActivityForResult()
方法所叫起的。系統會自動去判斷該如何傳遞result。在不需要result的情況下,result會被自動忽略。
Android Gallery和GridView組件:Gallery 畫廊Gallery是一個內部元素可以水平滾動,並且可以把當前選擇的子元素定位在它中心的布局組件。我們
目錄概述這是一個關於RecycleView滑動事件的輔助類,該輔助類可以檢測RecycleView滑動到頂部或者底部的狀態.可用於實現RecycleView加載更多或者刷
第7節 豎屏的播放界面播放視頻的功能放在一個單獨的Activity當中。我們將為它們設置橫豎屏兩種布局。在豎屏的時候,上半部分播放視頻,下半部分顯示視頻信息;
我們項目中經常會加載圖片,有時候如果加載圖片過多的話,小則導致程序很卡,重則OOM導致App掛了,今天翻譯https://developer.Android.com/tr