編輯:關於Android編程
前面的兩課一直關注了故事的一邊:從你的應用程序中啟動另一個應用程序的Activity。但是如果你的應用能夠執行一個可能對另外的應用程序有用的操作,那麼你的應用程序就應該准備響應來自其他應用程序的操作請求。例如,如果你創建了一個能夠跟用戶的朋友共享消息和照片的社區應用,那麼你就應該支持ACTION_SEND類型的Intent,以便用戶能夠啟動來自其他應用程序的共享操作,並加載你的應用程序來執行這個操作。
要允許其他的應用程序來啟動你的Activity,你需要在你的清單文件的相應的<activity>元素中添加一個<intent-filter>元素。
當你的應用程序被安裝到設備上時,系統會識別你的Intent過濾器,並把這個信息添加到一個由所有被安裝應用程序所支持的內部的Intent目錄中。當一個應用程序用隱含的Intent對象來調用startActivity()或startActivityForResult()方法時,系統就會在這個目錄中查找那些Activity能夠響應這個Intent的請求。
添加Intent過濾器
為了能夠正確的定義你的Activity所能處理的Intent對象,Activity接收的操作和數據應該盡可能在每個被添加的Intent過濾器中進行具體的定義。
如果Activity有一個跟下列Intent對象條件完全匹配的Intent過濾器,系統就會把給定的Intent對象發送給這個Activity:
Action
定義要執行的操作名稱(字符串)。通常是由平台定義的一個值,如ACTION_SEND或ACTION_VIEW。
使用過濾器中的<action>元素來指定操作。在這個元素中指定的值必須是該操作完整的字符串名稱,而不是API常量。
Data
定義跟該Intent匹配的數據
使用過濾器中的<data>元素來指定數據。使用這個元素中的一個或多個屬性,你能夠只簡單指定MIME類型、URI前綴、URI方案,或者是這些的組合,以及其他的能夠接收的數據類型的指示。
注意:如果你不需要聲明指定相關數據的Uri(如當你的Activity要處理其他類型的附加數據時,而不是URI),那麼就應該只指定android:mimeType屬性來聲明你的Activity所能處理的數據類型,如text/plain或image/jpeg。
Category
提供兩外一種Activity處理Intent對象的方法,通常與用戶的手勢或其他的位置有關。系統支持幾種不同的分類,但是很少被使用。但是默認情況下,所有的隱含的Intent對象都要使用CATEGORY_DEFAULT來定義。
在Intent過濾器中使用<category>元素來指定這個分類信息。
在你的Intent過濾器中,你可以在<intent-filter>元素中嵌套上述對應XML元素來聲明你的Activity所能接收的Intent對象的條件。
例如,以下Activity的Intent過濾器的聲明,能夠處理ACTION_SEND類型的Intent對象,並且數據類型可以是文本或圖片:
<activityandroid:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>
每個輸入的Intent對象只能指定一個操作和一種數據類型,但是在每個<intent-filter>元素中則可以聲明多個<action>、<category>、<data>元素的實例。
如果任何兩個操作和數據的行為是相互排斥的,那麼你應該給它們建立獨立的Intent過濾器,並在每個Intent過濾器中指定其可接收的操作和對應的數據類型。
例如,假設你的Activity可以使用ACTION_SEND和ACTION_SENDTO類型的Intent來處理文本和圖片。這種情況下,你就必須給這兩個操作分別定義獨立的Intent過濾器,因為ACTION_SENDTO類型的Intent對象必須使用數據的Uri來指定收件人的地址,例如:
<activityandroid:name="ShareActivity">
<!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
<intent-filter>
<action android:name="android.intent.action.SENDTO"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="sms" />
<data android:scheme="smsto" />
</intent-filter>
<!-- filter for sending text or images; accepts SEND action and text or image data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
注意:為了接收隱式的Intent對象,在Intent過濾器中必須包含CATEGORY_DEFAULT分類。如果包含了CATEGORY_DEFAULT分類,startActivity()和startActivityForResult()方法啟動的所有的Intent對象就會被處理,否則,隱式的Intent對象就不會被你的Activity所接收。
在你的Activity中處理Intent對象
為了決定在你的Activity中要執行的操作,你可以讀取啟動該Activity的Intent對象。
在Activity啟動時,調用getIntent()方法來獲取啟動該Activity的Intent對象。在Activity的生命周期內你可以在任何時間來做這件事,但是通常應該在早期的回到方法中(如onCreate()或onStart())來做這件事。
例如:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get the intent that started this activity
Intent intent = getIntent();
Uri data = intent.getData();
// Figure out what to do based on the intent type
if (intent.getType().indexOf("image/") != -1) {
// Handle intents with image data ...
} else if (intent.getType().equals("text/plain")) {
// Handle intents with text ...
}
}
返回結果
如果你想要把結果返回給調用者,只需簡單的調用setResult()方法來指定具體的結果代碼和結果Intent對象。當操作完成後,並要返回到最初的調用者,就要調用finish()方法來關閉(或銷毀)被調用的Activity,例如:
// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();
你必須要返回結果中指定結果代碼。通常它應該是RESULT_OK或RESULT_CANCELED。然後根據需要使用一個Intent對象來提供另外的數據。
注意:默認的結果會被設置為RESULT_CANCELED。因此,在操作完成和結果被設定之前,如果用戶按下返回按鈕,那麼初始的Activity就會收到“被取消”的結果。
如果你只是簡單的返回一個整數,來指明幾個可選結果中的一個,那麼你把結果代碼設置為任何比0大的值。如果你使用結果代碼來發送一個整數,並且不需要包含Intent對象,那麼你就可以調用setResult()方法,並且只給它傳遞一個結果代碼。例如:
setResult(RESULT_COLOR_RED);
finish();
在這種情況中,可能的結果很少,因此結果代碼可以是本地定義的整數(比0大)。這樣在把結果返回給你自己應用程序中的Activity時,就會很好的工作,因為接收結果的Activity可以引用公共的常量來判斷結果代碼的值。
注意:不需要檢查你的Activity是使用startActivity()方法、還是使用startActivityForResult()方法來啟動的。如果啟動你的Activity期望要有返回結果,那麼只需簡單的調用setResult()方法就可以了。如果啟動Activity調用的是startActivityForResult()方法,那麼系統就會把你提供給setResult()方法的結果發送給它,否則,這個結果會被忽略。
一、導入單個Eclipse項目 1.在Eclipse中導出包含有gradle的項目,操作如下: 如果操作中出現finish按鈕是灰色的,將force overridin
百度官方文檔:http://lbsyun.baidu.com/index.php?title=androidsdk使用步驟:下載百度地圖的SDK +申請密鑰 環境配置(
介紹Robolectric主要從框架簡介、框架優點、框架可行性分析,框架環境配置、框架演示、框架參考資料方面進行介紹:一、框架簡介官網的介紹Running tests o
概述:如果不是一些特殊的情況,我想大家很少會接觸到這個需求。其實Android的Java部分沒有提供相應的接口,這裡需要去調用C的代碼,也就是說要寫JNI了。關於JNI的