Android 應用的互動------Intent

來源:互聯網
上載者:User

標籤:tom   nts   parse   dialog   string   ons   pac   abc   guide   

  為了讓使用者能夠從一個activity跳到另一個activity,我們的app必須使用Intent來定義自己的意圖。當使用startActivity()的方法,且參數是intent時,系統會使用這個 Intent 來定義並啟動合適的app組件。使用intents甚至還可以讓app啟動另一個app裡面的activity。

  Activity、Service和BroadcastReceiver,都是通過Intent機制啟用的,而不同類型的組件在傳遞Intent時有不同的方式。

一.Intent的組成部分
  • Component屬性需要接受一個ComponentName對象,ComponentName需要指定包名和類名,這就可唯一確定一個組件類,這樣應用程式即可根據給定的組件去啟動特定的組件。
  • Action屬性和Category屬性都是一個普通的字串,其中Action代表該Intent所要完成的一個抽象“動作”,而Category則用於為Action增加額外的附加類別資訊。通常Action屬性會與Category屬性結合使用。
  • Data屬性通常用於向Action屬性提供操作的資料。Data屬性接受一個Uri對象,Uri字串總滿足如下格式:scheme://host:port/path
  • Type屬性用於指定該Data所指定Uri對應的MIME類型,這種MIME類型可以是任何自訂的MIME類型,只要符合abc/xyz格式的字串即可。
  • Extra屬性通常用於在多個Action之間進行資料交換,Intent的Extra屬性值應該是一個Bundle對象。
  • Flag屬性用於為該Intent添加一些額外的控制旗標
二.Intent的調用方法1.顯示(explicit)調用

  顯式Intent需要明確指定要啟動或者觸發的組件的類名 

  

2.隱示(implicit)調用

  隱式Intent只是指定需要啟動或者觸發的組件應滿足怎樣的條件。對於隱式Intent而言,Android系統需要對該Intent進行解析,解析出它的條件,然後再去系統中尋找與之匹配的目標組件。如果找到合格組件,就啟動或觸發它們。

  Implicit intents並不聲明要啟動組件的具體類名,而是聲明一個需要執行的action。這個action指定了我們想做的事情,例如查看,編輯,發送或者是擷取一些東西。Intents通常會在發送action的同時附帶一些資料,例如你想要查看的地址或者是你想要發送的郵件資訊。資料的具體類型取決於我們想要建立的Intent,比如URL或其他規定的資料類型,或者甚至也可能根本不需要資料。

例如:

//打電話Uri number = Uri.parse("tel:5551234");Intent callIntent = new Intent(Intent.ACTION_DIAL, number);//看地圖// Map point based on addressUri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");// Or map point based on latitude/longitude// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom levelIntent mapIntent = new Intent(Intent.ACTION_VIEW, location);//開啟網頁Uri webpage = Uri.parse("http://www.android.com");Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

  一些需要其他資料的隱示Intent,我們可以使用putExtra()方法來添加一些資料。如果我們沒有在intent中包含一個Uri, 則通常需要使用 setType() 方法來指定intent附帶的資料類型。設定MIME type 是為了指定應該接受這個intent的activity。

 

//發送一個帶附件的emailIntent emailIntent = new Intent(Intent.ACTION_SEND);// The intent does not have a URI, so declare the "text/plain" MIME typeemailIntent.setType(HTTP.PLAIN_TEXT_TYPE);emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); // recipientsemailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));// You can also attach multiple items by passing an ArrayList of Uris//建立一個日曆事件:Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());calendarIntent.putExtra(Events.TITLE, "Ninja class");calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

 

驗證是否有App去接收這個Intent:

  當觸發了一個intent,但是沒有任何一個app中的activity來接受,則app會crash。所以我們需要確保有intent會被系統內建的app(such as the Phone, Email, or Calendar app)之一接收。為了驗證是否有合適的activity會響應這個intent,需要執行queryIntentActivities() 來擷取到能夠接收這個intent的所有activity的list。若返回的List非空,那麼我們才可以安全的使用這個intent。例如:

 

PackageManager packageManager = getPackageManager();List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);boolean isIntentSafe = activities.size() > 0;

 

顯示分享App的選擇介面

  請注意,當以startActivity()的形式傳遞一個intent,並且有多個app可以handle時,使用者可以在彈出dialog的時候選擇預設啟動的app(通過勾選dialog下面的選擇框,如所示)。該功能對於使用者有特殊偏好的時候非常有用(例如使用者總是喜歡啟動某個app來查看網頁,總是喜歡啟動某個camera來拍照)。

  為了顯示多個開啟檔案, 需要使用createChooser()來建立Intent:

 

Intent intent = new Intent(Intent.ACTION_SEND);...// Always use string resources for UI text. This says something like "Share this photo with"String title = getResources().getText(R.string.chooser_title);// Create and start the chooserIntent chooser = Intent.createChooser(intent, title);startActivity(chooser);
三.接收Activity返回的結果

  啟動另外一個activity並不一定是單向的。我們也可以啟動另外一個activity然後接受一個返回的result。為接受result,我們需要使用startActivityForResult() ,而不是startActivity()。

  當然,被啟動的activity需要指定返回的result。它需要把這個result作為另外一個intent對象返回,我們的activity需要在onActivityResult()的回調方法裡面去接收result。

  對於startActivityForResult() 方法中的intent與之前介紹的並無太大差異,不過是需要在這個方法裡面多添加一個int類型的參數。

該integer參數稱為"request code",用於標識請求。當我們接收到result Intent時,可從回調方法裡面的參數去判斷這個result是否是我們想要的。

//啟動activitystatic final int PICK_CONTACT_REQUEST = 1;  // The request code...private void pickContact() {    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);}//接收Result/*當使用者完成了啟動之後activity操作之後,系統會調用我們activity中的onActivityResult() 回調方法。該方法有三個參數:通過startActivityForResult()傳遞的request code。第二個activity指定的result code。如果操作成功則是RESULT_OK ,如果使用者沒有操作成功,而是直接點擊回退或者其他什麼原因,那麼則是RESULT_CANCELED包含了所返回result資料的intent。*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    // Check which request we‘re responding to    if (requestCode == PICK_CONTACT_REQUEST) {        // Make sure the request was successful        if (resultCode == RESULT_OK) {            // The user picked a contact.            // The Intent‘s data Uri identifies which contact was selected.            // Do something with the contact here (bigger example below)        }    }}

  處理Intent的activity返回result只需要執行setResult(),通過指定一個result code與result intent。操作完成之後,使用者需要返回到原來的activity,通過執行finish() 關閉被喚起的activity。

 

 // Create intent to deliver some kind of result dataIntent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");setResult(Activity.RESULT_OK, result);finish();

 

  result code的值通常RESULT_OK或RESULT_CANCELED(預設)。如果只是純粹想要返回一個int來表示某些返回的result資料之一,則可以設定result code為任何大於0的數值。如果我們返回的result只是一個int,那麼連intent都可以不需要返回了,可以調用setResult()。

setResult(RESULT_COLOR_RED);finish();

 

四.Intent過濾

  通過在manifest檔案中的<activity>標籤下添加<intent-fliter>的屬性,使其他的app能夠啟動我們的activity。

  為了儘可能確切的定義activity能夠handle的intent,每一個intent filter都應該儘可能詳盡的定義好action與data。

  • Action:一個想要執行的動作的名稱。通常是系統已經定義好的值,如ACTION_SENDACTION_VIEW。 在intent filter中通過<action>指定它的值,值的類型必須為字串,而不是API中的常量(看下面的例子)

  • Data:Intent附帶資料的描述。在intent filter中通過<data>指定它的值,可以使用一個或者多個屬性,我們可以只定義MIME type或者是只指定URI prefix,也可以只定義一個URI scheme,或者是他們綜合使用。

  • Category:提供一個附加的方法來標識這個activity能夠handle的intent。通常與使用者的手勢或者是啟動位置有關。系統有支援幾種不同的categories,但是大多數都很少用到。而且,所有的implicit intents都預設是 CATEGORY_DEFAULT 類型的。在intent filter中用<category>指定它的值。
<activity android: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>

Android 應用的互動------Intent

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.