創建一個intent時,必須要指定intent將要觸發的操作。Android定義了很多操作,包括ACTION_SEND,就象可以猜到的一樣,表示intent是把數據從一個activity發送給另一個,就算是跨界。要發送數據給其他activity,值需要指定數據和它的類型,系統會識別可兼容的接收activity然后展示給用戶(如果有多個選擇)或者立刻啟動activity(如果只有一個選擇)。相似的,也可以通過在manifest中設置來注冊你的activity可以接收其他程序的哪些數據類型。
用intent在程序之間發送和接收數據是最常用的社會化分享。Intent讓用戶可以快速的分享信息並且容易的使用他們喜歡的程序。
注意:最好的添加分享操作到Actionbar的方法是使用ShareActionProvider,在API等級14之后可用。ShareActionProvider會在后面討論。
發送字符串內容
使用ACTION_SEND時最常用和簡單的操作是發送字符串內容從一個activity到另一個。例如,內置的瀏覽器app可以以字符串的形式分享當前顯示網頁的URL給任何程序。這對於通過郵件和社交網絡和朋友分享文章或網頁時很有用。這里有一些代碼實現了這種分享:
1 Intent sendIntent = new Intent(); 2 sendIntent.setAction(Intent.ACTION_SEND); 3 sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); 4 sendIntent.setType("text/plain"); 5 startActivity(sendIntent);
如果有一個程序匹配ACTION_SEND和MIME類型text/plain,Android系統會運行它。如果超過一個程序匹配,系統會顯示一個對話框讓用戶選一個app。如果為intent調用Intent.createChooser(),Android會總是顯示選擇對話框。這有一些好處:
- 就算用戶選擇了這個intent的默認操作,選擇對話框仍然會顯示。
- 如果沒有匹配的程序,Android會顯示系統消息
- 可以為選擇對話框指定一個標題
這里是更新后的代碼:
1 Intent sendIntent = new Intent(); 2 sendIntent.setAction(Intent.ACTION_SEND); 3 sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); 4 sendIntent.setType("text/plain"); 5 startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));
結果對話框如圖1
圖1.手機上的ACTION_SEND intent截屏
也可以為intent設置一些其他的信息:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT。然而,如果接收的程序沒有打算用他們,什么都不會發生。也可以自定義extras,但是沒有任何影響除非接收程序能解析他們。最典型的是,使用接收程序自定義的extras。
注意:一些email程序,比如Gmail,期望獲得String[]類型的EXTRA_EMAIL,EXTRA_CC等,使用putExtra(string, string[])來把他們加入intent。
發送二進制內容
二進制數據是使用ACTION_SEND並且設置合適的MIME類型並且在附件數據中的EXTRA_STREAM中放一個指向數據的URI來分享的。這個通常用來分享圖片,但是也可以用來分享任何類型的二進制內容:
1 Intent shareIntent = new Intent(); 2 shareIntent.setAction(Intent.ACTION_SEND); 3 shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); 4 shareIntent.setType("image/jpeg"); 5 startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
注意下面的內容:
- 可以設置MIME類型為"*/*",但是這樣會匹配到很多可以處理數據流的app。
- 接收的程序需要進入URI指向的數據的權限。有一些方法可以處理:
- 把數據寫到外部存儲上(比如SD卡),那樣的話所有app都可以讀。使用Uri.fromFile()來創建傳遞給share intent 的URI。然后,注意並不是所有的程序都能處理file://形式的Uri。
- 在自己程序文件夾下用MODE_WORKD_READABLE模式使用openFileOutput()把數據寫入文件,之后再用getFileStreamPath()返回一個File。和前面的差不多,用Uri.fromFile()來為share intent創建一個file://樣式的Uri。
- 象圖片,音頻,視頻這樣的媒體文件可以用scanFile()掃描然后加到系統媒體庫(MediaStore)中,onScanCompleted()回調方法會返回一個content://樣式的Uri,也可以加到share intent中
- 圖片可以用insertImage()來加到媒體庫(MediaStore)中,然后會返回一個content://樣式的Uri,可以再share intent中使用。
- 在自己的ContentProvider中保存數據,要確保其他的app有正確的權限來訪問你的provider(或者使用per-URI permissions)。
發送多條數據
要發送多條數據,使用ACTION_SNED_MULTIPLE和一個指向數據的URI list。MIME類型根據分享的內容不同而不同。例如,如果分享3張JPEG圖片,那么類型為"image/jpeg"。如果有不同的圖片類型,那么就應該用"image/*"來匹配處理不同類型圖片的activity。如果要處理各種不同的類型就應該用"*/*"了。正如前面提到的,分析和處理分享是數據是接收程序的事情了。這里是一個例子:
1 ArrayList<Uri> imageUris = new ArrayList<Uri>(); 2 imageUris.add(imageUri1); // Add your image URIs here 3 imageUris.add(imageUri2); 4 5 Intent shareIntent = new Intent(); 6 shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); 7 shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); 8 shareIntent.setType("image/*"); 9 startActivity(Intent.createChooser(shareIntent, "Share images to.."));
正如前面提到的,要確保URI指向的數據要可以被接收程序訪問到。
下一篇:Android - 分享內容 - 接收其他APP的內容