1. 程式人生 > >android 應用程式間跳轉

android 應用程式間跳轉

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資料來表示電話號碼。

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

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

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

訪問一個地圖:

// 基於地址的地圖上的點
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);

訪問一個網頁:

Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

預設情況下,系統通過intent附加的Uri資料來決定適合的MIME型別,如果你的intent裡並沒有Uri,那麼你需要使用setType()來明確intent相關的資料型別。而確定MIME型別更加明確了哪一類activity才是最應該接受該intent的。其它的隱式intent需要"附加的"其它型別的資料,比如string,你可以通過不同的putExtra()方法來增加一個或多個附加資料。

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

傳送帶附件的email:

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來附加多個數據

建立一個月曆事件

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應用。

確保有一個應用接收了Intent

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

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

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

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會彈出的選擇對話方塊。

startActivity(intent);

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

//建立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().比如:

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()方法,從而顯示了一個應用程式選擇對話方塊,並將提供的文字作為對話方塊標題。

轉自:http://www.ablanxue.com/prone_8979_1.html

不同的APP應用之間如何跳轉


大家都知道安卓裡面intent是用於橋樑 ,用於頁面和service之間的跳轉,那我當時有疑問 intent可否用於APK之間的橋樑跳轉呢? 最近在專案中就遇到這樣的一個問題 其實上是可行的 但是需要ComponentName這個元件
下面給大家參照一段程式碼的例子

Intent _Intent;
ComponentName _ComponentName ;
_Intent = new Intent()
_ComponentName = new ComponentName("com.autonavi.xmgd.navigator","com.autonavi.xmgd.navigator.Logo");
_Intent.setComponent(_ComponentName);

說明:上面ComponentName有兩個引數 第一個引數 :包名 第二個引數:類的命名 上面的事例是可以直接跳轉到高德導航的APK 假如到跳轉 你的手機必須要安裝這個APK 那我還有一個疑問 你是怎樣拿到高德導航的包名和類名麼? 你可以隨便開啟一個APK的應用 然後檢視裡面的log 你會找到這個應用的開啟activity資訊的 。假如不信的話,你現在可以試一下! 最後執行跳轉的時候 別忘記了 還有執行 startActivity(_Intent); 

例:

Intent intent = new Intent(); 
intent = getPackageManager().getLaunchIntentForPackage( "com.yzi.WelcomeActivity"); 
startActivity(intent);


跳轉到app2的指定介面

app1Intent it=new Intent();
it.setComponent(new ComponentName(String packageName,String activityName ));
startActivity(it);

<span style="font-family:Arial;">ComponentName componetName = new ComponentName("com.package_name","com.package_name.activity_name"); 
  try 
   { 
          Intent intent = new Intent(); 
          intent.setComponent(componetName);
          tartActivity(intent); 
    } 
    catch (Exception e) 
    { 
        Log.i(TAG, e.toString());

      Toast.makeText(getApplicationContext(), "未找到可用應用程式!",Toast.LENGTH_LONG).show();
     }
</span>


在app2的AndroidManifest.xml中配置你指定Activity的Intentfilter的action,如,intent中set這個action就可以了;
另外該指定Activity還需新增一個屬性:android:exported="true";

   <activity
            android:name="com.package_name.activity_name)"
            android:label="@string/title_activity_mnie_consume" 
            android:exported="true" 
            >
              <intent-filter android:priority="1000" >
                <action android:name="<span style="font-family: Arial;">com.package_name.activity_name</span>" />
            </intent-filter>
        </activity>

相關推薦

android 應用程式

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

程式最新功能調整

以下選自微信小程式官方文件調整說明: 調整具體措施如下: 1、需要使用者觸發跳轉 即日起,若使用者未點選小程式頁面任意位置,則開發者將無法呼叫 wx.navigateToMiniProgram 介面自動跳轉至其他小程式。 2、需要使用者確認跳轉 在跳轉至其他小

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

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

Android 應用程式之間的

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

老羅 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應用程式資源的編譯和打包過程,最終得到的應用程式資源就與

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

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

Android 兩個APP

通過intent實現不同APP間跳轉 通過了解APP間的跳轉,加深對於intent的理解 首先需要APP1和APP2,然後在APP1中activity中新增一個點選事件,希望跳轉到APP2的activity中。 APP1跳轉程式碼: Intent intent

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

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

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

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

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中兩個APP導致的異常問題及解決辦法

假設現有兩個APP:app1 和 app2 兩個app中均有兩個Activity:A 和 B 且兩個app的入口Activity均是:A 操作流程:app1.A ---> app.B ---> app2.A ---> app2.B 1.從app1.B向a

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

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

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

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

Android activity之間的和數據傳遞

.get 結果 設置 空白頁 system mod project idt ride 1、Activity之間的跳轉 並且 傳遞數據   A Activity進行的操作 Intent intent = new Intent(context, B.class

Android中當前Activity到當前Activity頁面

頁面 context android plan nbsp text ini putextra min 步驟:先關閉自己,在跳轉 case R.id.btn_copy:// 復制 Toast.makeText(mContext, "正在復制", Toast.LEN

Android項目頁面小Demo

發的 back name font per create java類 單擊 parent 近期在做Android項目的開發,剛剛接觸會有非常多新東西須要學習,從環境的搭建到語言的熟悉都是須要一步步完畢的,接下來就拿一個頁面跳轉的樣例來和大家分享一下自己的心得

spring mvc controller 重定向 傳參

ron nan rep else 必須 轉發 lis 代碼 control spring mvc controller間跳轉 重定向 傳參 1. 需求背景 需求:spring MVC框架controller間跳轉,需重定向。有幾種情況:不帶參數跳轉,帶參數拼接ur