1. 程式人生 > >Android 應用程式之間的跳轉

Android 應用程式之間的跳轉

作者:handsomedylan

Sending the User to Another App

Android最重要的特性之一就是:一個應用可以基於不同的 action,把使用者推送到其他應用中去。比如說,如果你想在你的應用中顯示一張帶有商店地址的地圖,你並不需要在自己的應用中去實現一個顯示地圖的Activity,而是可以通過Intent來發出一個請求來顯示這個商店的地址,Android系統會自動幫你開啟一個合適的應用。

正如在第一節課——建立你的第一個應用——裡學到的,在你的應用中,你必須使用Intents來在你應用裡的Activity之間遊走。通常你都需要一個顯式的Intent,即包含有確切類名資訊的Intent.但是當你想要從一個獨立應用中去完成一個action,比如開啟一個地圖,那麼你必須使用隱式的Intent. 這節課向你展示,如何建立一個隱式的intent來完成一個特定的action,以及如何使用它來啟動一個activity並且在別的應用裡實現該action。

建立一個隱式的Intent

建立一個隱式的Intent並不宣告要啟動的元件的類名,而是宣告要執行的一個動作(action),這個action詳述了你想要做的事,比如觀看,編輯,傳送或是獲取一些資料。Intent也經常在action裡附加相關的資料,比如你想訪問的地址,或是你傳送郵件的內容。根據你想建立的intent,資料可能是一個Uri或是其它資料型別,也可能不包含任何資料。

如果你的資料是一個Uri,那麼你可以很呼叫一個很簡單的Intent()建構函式來定義action和資料。

例如,以下是如何建立一個Intent來打電話,在這裡我們用Uri資料來表示電話號碼。

1
2
Uri
number = Uri.parse("tel:5551234"); Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

當你的應用通過startActivity來使用該intent時,電話應用程式就會以指定號碼啟動。

以下是一些其它的intent以及他們的action和Uri資料對:

  • * 訪問一個地圖:
1
2
3
4
5
// 基於地址的地圖上的點
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"
); //或者基於經緯度 // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z引數為縮放級別 Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
  • * 訪問一個網頁:
1
2
Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

其它的隱式intent需要"附加的"其它型別的資料,比如string,你可以通過不同的putExtra()方法來增加一個或多個附加資料。

預設情況下,系統通過intent附加的Uri資料來決定適合的MIME型別,如果你的intent裡並沒有Uri,那麼你需要使用setType()來明確intent相關的資料型別。而確定MIME型別更加明確了哪一類activity才是最應該接受該intent的。

以下是包含附加資料的intent:

  • * 傳送帶附件的email:
1
2
3
4
5
6
7
8
Intent emailIntent = new Intent(Intent.ACTION_SEND);
// 這個intent不含URI, 所以聲明瞭"text/plain" MIME型別
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); // 收件人
emailIntent.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"));
//你也可以通過傳遞一組Uri來附加多個數據
  • * 建立一個月曆事件。
1
2
3
4
5
6
7
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,僅可在API14及以上的版本中才可使用。

注意 :把你的Intent定義的儘可能明確是什麼重要的,比如說,如果你想要通ACTION_VIEW來顯示一張圖片,你應該明確MIME型別為image/* .這樣就可以防止誤啟動別的支援該action的可以顯示別的資料型別的應用,比如map應用。

Verify There is an App to Receive the Intent-確保有一個應用接收了Intent

儘管Android平臺確保特定的intent會被解析到一個內建的應用程式(比如電話,簡訊,日曆),你仍然需要在使用intent前進行一下確認。

小心: 如果你發起一個在裝置上無法被任何應用程式處理的intent,那麼你的程式就會崩潰。

為了確認有一個activity能響應該intent,可以使用queryIntentActivities()來獲取一個能處理該intent的activity列表,如果返回的列表非空,那麼你就可以安全的使用這個intent了。例如:

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

如果 isIntentSafe為真,那麼至少有一個程式會響應該intent,反之,則沒有。

** 注意 :** 你應該在程式一開始時就進行該項檢查,從而在使用者嘗試使用該intent之前移除這個功能。如果你知道一個特定的應用程式可以處理這個intent,那麼你也可以提共一個連結來讓使用者下載該應用程式(檢視如何在GooglePlay上連線你的產品)

用Intent來啟動一個Activity

一旦你建立了你的Intent並設定好了附加資訊,就可以呼叫startActivity()來把它傳送到系統中去,如果系統發現多個程式匹配該intent,那麼它會顯示一個對話方塊供使用者挑選,如圖1所示。如果只有一個,系統會直接啟動它。

圖 1.當多個應用匹配intent會彈出的選擇對話方塊。

1
startActivity(intent);

以下是一個完整的例子,它向你展示瞭如何建立一個可以訪問地圖的的intent。先確定有一個可以處理該intent的程式,再啟動它。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//建立intent
Uri location 1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
// 確定它可以被處理
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// 如果安全的話,啟動一個activity
if (isIntentSafe) {
    startActivity(mapIntent);
}

顯示一個應用程式選擇框

當你呼叫startActivity()來傳遞Intent,而且有多個應用程式區配該intent時,使用者可以選擇一個預設選項(通過選中對話方塊底的一個checkbox)。這對於一個使用者通常想用一個固定程式的action(比如瀏覽網頁和拍照)來說,是很好的,但是對於一個使用者更願意去每次選擇不同應用程式來執行的action而言,你需要顯式的彈出一個選擇對話方塊,並強制使用者每次使用都做出選擇。(使用者無法選擇預設程式)。

圖 2. 當你用 createChooser()來強制顯示匹配你intent的應用列表時,彈出的選擇對話方塊。

為了顯示選擇器,呼叫createChooser()建立一個intent,並將其傳給startActivity().比如:

1
2
3
4
5
6
7
8
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);
// 建立並開啟一個選擇器
Intent chooser = Intent.createChooser(intent, title);
startActivity(chooser);

以上把intent傳入createChooser()方法,從而顯示了一個應用程式選擇對話方塊,並將提供的文字作為對話方塊標題。

相關推薦

android 應用程式

Sending the User to Another App Android最重要的特性之一就是:一個應用可以基於不同的 action,把使用者推送到其他應用中去。比如說,如果你想在你的應用中顯示一張帶有商店地址的地圖,你並不需要在自己的應用中去實現一個顯示地圖的Act

Android 應用程式之間

作者:handsomedylan Sending the User to Another App Android最重要的特性之一就是:一個應用可以基於不同的 action,把使用者推送到其他應用中去。比如說,如果你想在你的應用中顯示一張帶有商店地址的地圖,你並不需要在自己的應用中去實現一個顯示地圖的Act

nordic空中升級應用程式快速到bootloader

  nordic  nrf52832的空中升級,其實很簡單,對於初學者,只要是協議棧和sdk版本相同,都可以直接使用別人的boot和祕鑰,以及setting 除了app以外的所有檔案,所以只需要實現從app跳轉到升級程式既可以。 關於那個應用程式跳轉到bootloader 網

微信小程式之間(無繫結)

首頁咱們先說下小程式跳轉到小程式/小遊戲的條件: 開啟同一公眾號下關聯的另一個小程式。(注:必須是同一公眾號下,而非同個 open 賬號下) 基於這個條件,小程式要想跳到一個沒有關聯的小程式或者小遊戲是不可能的。 但如果有一箇中轉站和其他小程式和小遊戲繫結,某個小程式可

Android 應用程式之間資料共享

  如何將應用程式的資料暴露出去? Android提供了ContentProvider,一個程式可以通過實現一個Content provider的抽象介面將自己的資料完全暴露出去,而且Content providers是以類似資料庫中表的方式將資料暴露。Content providers儲存和檢索資料,通過

老羅 Android應用程式資源的查詢過程分析

原文地址  http://blog.csdn.net/luoshengyang/article/details/8806798   轉載請說明     我們知道,在Android系統中,每一個應用程式一般都會配置很多資源,用來適配不同密

自老羅 Android應用程式資源的編譯和打包過程分析

原文地址   http://blog.csdn.net/luoshengyang/article/details/8744683 轉載自老羅,轉載請說明   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過An

自 老羅 Android應用程式資源管理器(Asset Manager)的建立過程分析

原文地址在 http://blog.csdn.net/luoshengyang/article/details/8791064 原創老羅,轉載請說明     在前面一篇文章中,我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與

6.Android的學習(Intent頁面,活動之間傳遞資料)

Intent跳轉頁面 (1)使用顯示Intent,首先建立一個空的活動,並且有佈局,在onClick()下面新增: Intent裡面的第一個引數是當前活動頁面,第二引數是要跳轉的活動頁面。這段程式碼在當前活動頁面。 2.  (1)向下一個活動傳遞資料  · 主活動介

android應用程式的混淆打包()

target=android-8 proguard.config=proguard.cfg Eclipse會通過此配置在工程目錄生成proguard.cfg檔案  2 . 生成keystore (如已有可直接利用) 按照下面的命令列 在D:\Program 

Android應用程式元件Content Provider在應用程式之間共享資料的原理分析

                        在Android系統中,不同的應用程式是不能直接讀寫對方的資料檔案的,如果它們想共享資料的話,只能通過Content Provider元件來實現。那麼,Content Provider元件又是如何突破應用程式邊界許可權控制來實現在不同的應用程式之間共享資料的呢?

Android應用程式的記憶體分析(翻譯)(

作者:Tim Bray Dalvik虛擬機器支援垃圾收集,但是這不意味著你可以不用關心記憶體管理。你應該格外注意移動裝置的記憶體使用,在上面記憶體空間是受到限制的。在這篇 文章裡面,我們來看看Android SDK裡面的一些記憶體剖析工具(profiling tools)

Android單擊通知欄後返回正在執行的程式到指定fragment頁面

今天寫通知欄的時候遇到了這樣的一個問題:在fragment中傳送通知,點選通知後跳轉到指定的fragment。 第一思路就是建立一個通知,點選通知後啟動activity,在activity接受傳入過來的值來判斷啟動那個fragment。 既然有思路了,就開始

iOS應用程式開發之應用間的

簡介 配置和實現 判斷應用啟動方式 一、簡介 最實際專案開發中,我們難免會遇到需要從一個應用跳轉到另一個應用的情況。比如微信分享,實際就是一種應用間的跳轉。但是有時候我們需要實現自己的兩個應用間的跳轉,以便可以推廣我們其他的應用。這個時候我們需要使用UIApplication的openUR

IOS應用內及應用之間URL

蜂窩網路:prefs:root=MOBILE_DATA_SETTINGS_ID網路:      prefs:root=General&path=Network/***Wi-Fi:    prefs:root=WIFI定位服務:prefs:root=LOCATION_SERVICES個人熱點:prefs

android:scheme 通過uri到APP應用指定Activity

最近公司有個需求,點選第三方APP或者APP內的H5頁面然後直接跳轉到APP裡面,比如瀏覽器開啟一個H5頁面,然後點選某個連結就直接到APP的某個指定的Activity,經過研究發現實現還是蠻easy的,下面說下方法吧。 首先,在AndroidManifest.xml裡面進

Android 自己的應用中,到該應用的詳細設定頁面,設定許可權頁面--以及到系統的設定頁面

跳轉到自己的設定介面 public static void toSelfSetting(Context context) { Intent mIntent = new Inte

Android開發之Intent到系統應用中的撥號介面、聯絡人介面、簡訊介面

現在開發中的功能需要直接跳轉到撥號、聯絡人、簡訊介面等等,查找了很多資料,自己整理了一下。          首先,我們先看撥號介面,程式碼如下: Intent intent =new Intent();                 intent.setAction("an

Android應用中,到該應用的詳細設定頁面,設定許可權頁面

主要使用場景: 我們請求許可權時,使用者拒絕了之後,需要引導使用者重新開啟許可權。 實現程式碼片段: 1、 public static void goAppDetailSettingIntent(C

Xamarin Android Activity之間與傳值

Activity跳轉與傳值,主要是通過Intent類來連線其他Activity進行資料的傳遞。   1.不帶資料跳轉 Intent intent = new Intent(this, typeof(Add)); StartA