1. 程式人生 > >Android 通過scheme連結開啟本地應用

Android 通過scheme連結開啟本地應用

前言:最近做一個在桌面新增快捷方式的功能,用普通常規的新增快捷方式大多數手機都建立不出來, 尤其是像小米這種只有一層的桌面,因此採取了apk式快捷方式,顧名思義就是在桌面安裝一個apk來做為快捷方式, 當點選快捷方式(apk)的時候直接開啟主應用的相應介面。

1、方式一,用Intent來啟動主應用對應介面,設定包名以及要開啟的介面的全路徑,還要在配置檔案中設定此介面exported=true:

Intent intent = new Intent(); 
ComponentName cn = new ComponentName(packageName, className);             
intent.setComponent(cn); 
startActivity(intent); 

通過這種方式開啟應用經測試在大多數手機上沒問題,但是在三星手機上點選快捷方式啟動應用後,再點返回鍵退出應用,這時候應用會自動重啟,結束不掉。

2、方式二, 用scheme開啟

可以在你想要開啟的應用的Activity中加scheme和host,scheme和host都可以自己取值,當然host不是必須要的,但scheme是必須要的,指定好了以後,就有了這麼一個路徑:scheme://host?key1=引數1&key2=引數2    ,我們就可以通過這個路徑來啟動應用了,一般只啟動LauncherActivity, 然後通過LauncherActivity往其他頁面中轉。

那麼我們的快捷方式的MainActivity就可以這麼寫了:

if (!PackageUtils.isInstall(context, "packageName")) {
    // 判斷是否安裝主應用, 如果沒安裝快捷方式會進入主頁,提示使用者下載
    return;
}

Intent it = new Intent(Intent.ACTION_VIEW, Uri.parse("warehouse://?where_shotcut=" + BuildConfig.ShortCutName));
context.startActivity(it);
((Activity) context).finish(); // 跳轉過去後立刻自殺, 讓網倉3號起來

上面程式碼的含義是:首先判斷是否安裝了主應用, 如果沒安裝則進入快捷方式的主頁,快捷方式的主頁是一個下載連結,提示使用者下載主應用, 如果安裝了則會走到下面三句程式碼開啟主應用的目標介面, 注意我在程式碼中沒有使用host,通過:"scheme://?key=引數" 這種形式來開啟主應用。

3、用webview開啟應用

在上面第二點中講到,設定scheme和host後會產生一個連結:scheme://host?key1=引數1&key2=引數2

這時候我們在快捷方式主頁可以放一個webview, 直接用webview來開啟應用:

webview.loadUrl("scheme://host?key1=引數1&key2=引數2");

經測試第二點和第三點完美開啟應用,都不會有問題,我還反編譯了支付寶“一步支付寶付款”的apk式快捷方式,它使用的就是第三種方式。

4、開啟主應用以後,那麼主應用如何解析scheme並且如何拿到引數中的資料呢:

        Intent intent = getIntent();
        String scheme = intent.getScheme();
        Uri uri = intent.getData();
        System.out.println("scheme:"+scheme);
        if (uri != null) {
            String host = uri.getHost();
            String dataString = intent.getDataString();
            //獲得引數值
            String key1 = uri.getQueryParameter("key1");

            String key2 = uri.getQueryParameter("key2");
         }