標籤:
我們開發Android App時間應用,有些需求,我們需要啟動另一App為了應對一些邏輯。例如,我們需要映射基於地址調用系統或相關Map App,所以,我們不自己有App在相應的功能的製備。而是通過Intent來發送一些請求,調用相關的應用來處理這些請求。而且我們稱這樣的Intent為隱式的Intent;這樣的隱式的Intent是相對於顯式的Intent來講的。顯式的Intent我們都比較熟悉,顯式的Intent經常須要聲明類的名稱,而隱式的Intent我們須要聲明一個Action,我們Action中定義了我們想要處理的請求。與Action相關聯的還有data,比如我們須要查看的地址。或者我們須要撥打的電話號碼,或者我們須要發送郵件的郵件地址等等。比如:
Uri number = Uri.parse("tel:5551234");Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
上述代碼中,我們通過startActivity()來調用Phone App,並進行撥打(5551234)的通話操作。當然這裡還有非常多案例,這裡主要是從API 文檔中摘錄的了。貼在這裡供大家參考。
查看地圖:
// 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 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");
此外,我們在定義我們的Intent的時候,要儘可能的具體,比如我們希望調用系統的圖片查看器瀏覽圖片。我們應該定義MIME type" image/*.",以防止會啟動map app進行查看。並且假設沒有app來響應我們的請求,我們的app就會崩潰。
因此為了防止我們的app發送intent沒有其它app來響應而導致應用異常退出,我們在發送intent前進行驗證。為了驗證是否有app的Activity來響應我們的Intent請求,我們須要調用queryIntentActivities()來進行驗證。
這種方法會返回一個list,我們通過推斷list是否為空白來驗證。這樣我們能夠安全的使用Intent來實現不同App之間Activity的互動。假設沒有響應的Acitivty來響應,我們能夠提供一些連結給使用者進行下載安裝。驗證方法例如以下:
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;
以下我們通過詳細的案例來使用隱式的Intent,使不同的App中的Activity進行互動。
首先我們建立第一個項目appsend,我們建立一個button。而且在點擊事件中建立Intent。並設定Action和type,並加入onActivityResult()來接收我們從第二個應用中返回的資料。
public void button(View view) {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setType("test/");startActivityForResult(intent, 2);}
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case 2:switch (resultCode) {case Activity.RESULT_OK:text.setText("URI:" + data.getDataString());break;}break;}}
第二步:我們建立第二個應用,而且在資訊清單檔裡進行配置Intent-filter;
<activity android:name="com.example.appreceiver.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:mimeType="test/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
第三步:在第二個Activity中監聽返回button,並傳回資料。
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_BACK:Intent result = new Intent("com.example.appsend",Uri.parse("content://result_uri"));setResult(Activity.RESULT_OK, result);finish();break;}return super.onKeyDown(keyCode, event);}詳細案例為:http://download.csdn.net/detail/huangyabin001/7561309點擊開啟連結
著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。
在深入分析:Android在app之間的相互作用(一個,使用Action)