在深入分析:Android在app之間的相互作用(一個,使用Action)

來源:互聯網
上載者:User

標籤:

        我們開發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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.