[Android Studio] 簡單實作:如何從一個App開啟另一個App

※ 在A APP按下按鈕後,開啟B APP

※ deeplink

 


在 A APP 做一個按鈕

加入以下程式

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String uri = "OpenAnotherApp://star_home/hero?id=94&type=super"; // 目標
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MAIN); // 改 Intent.ACTION_VIEW 可以開啟別的APP的某個Activity
        intent.addCategory(Intent.CATEGORY_BROWSABLE); // 預設不要改
        intent.addCategory(Intent.CATEGORY_DEFAULT); // 預設不要改
        intent.setData(Uri.parse(uri));
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
        }
    }
});

其中 

uri 是自訂義 

結構長這樣 

[scheme] :// [host][path] ? [QueryParameter] = {xxx} & [QureyParameter] = {xxx}

所以以這段 uri 為例 

OpenAnotherApp://star_home/hero?id=94&type=super 

→ scheme =  OpemAnotherApp

→ host = star_home

→ path = /hero

→ 第一個 QureyParameter 的名字 = id , 值為 94

→ 第二個 QureyParameter 的名字 = type , 值為 super

 

從來沒接觸過的 一定完全搞不清楚上面是在幹嘛

沒關係

我們先接著繼續做

用例子來說明比較清楚

 

接著 建立第二個 APP

打開他的 AndroidManifest.xml

剛建立好的專案,初始會長這樣

我們在 <activity> </activity> 內加入以下程式碼

<intent-filter>
   <action android:name="android.intent.action.VIEW" />

   <category android:name="android.intent.category.DEFAULT" />
   <category android:name="android.intent.category.BROWSABLE" />

   <data
      android:host="star_home"
      android:path="/hero"
      android:scheme="OpenAnotherApp" />
</intent-filter>

變成這樣

此時你可以注意到 <data> 標籤內的值

scheme =OpenAnotherApp

host =star_home

path =/hero

 

剛好就是我們在第一個APP裡 uri 設的值  (  uri = "OpenAnotherApp://star_home/hero?id=94&type=super"  )

 

其實,

做到這個步驟

我們已經把兩個APP連結起來了

 

此時

把兩個APP都Build在你的手機裡

 

打開 A APP

按下按鈕後

 

就會開啟另外一個APP了

至於剛剛 uri 內的 後半段  id=94&type=super  是幹嘛的呢?

 

他是用來讓你從A APP夾帶參數帶到B APP用的

怎麼從 B APP 取得這兩個值呢?

 

我們在B的 MainActivity.java 內加入以下程式碼

Uri uri = getIntent().getData();
String getFromUri_id = uri.getQueryParameter("id");
String getFromUri_type = uri.getQueryParameter("type");
((TextView) findViewById(R.id.text_id)).setText(getFromUri_id);
((TextView) findViewById(R.id.text_type)).setText(getFromUri_type);

如圖

其中

我們可以看到 

uri.getQueryParameter("id")

uri.getQueryParameter("type")

這兩個就是取出

參數名稱為 "id"

參數名稱為 "type"

的值

      uri = "OpenAnotherApp://star_home/hero?id=94&type=super"

      → 第一個 QureyParameter 的名字 = id , 值為 94

      → 第二個 QureyParameter 的名字 = type , 值為 super

                                                                                                             」

 

此時從A App 按下按鈕後

打開的 B App 就會長這樣

 

如此就大功告成拉!!!

 

 

 

註:

uri.getScheme();
uri.getHost();
uri.getPath();

有興趣的朋友還可以再多試這三行

其實功能就跟方法名稱一樣

取出 uri 的 " scheme " , " host " 和 " path "

 

以   uri = "OpenAnotherApp://star_home/hero?id=94&type=super"  為例

uri.getScheme() 可以得到OpenAnotherApp

uri.getHost() 可以得到star_home

uri.getPath() 可以得到/hero

 

寫得嚴謹一點,其實可以多加一點判斷

像這樣

if ( uri.getScheme().equals("OpenAnotherApp") && uri.getHost().equals("star_home") && uri.getPath().equals("/hero") )