Android 跳轉(zhuǎn)到第三方應(yīng)用(應(yīng)用間的跳轉(zhuǎn))

文章部分內(nèi)容轉(zhuǎn)載于:https://blog.csdn.net/qq_40967402/article/details/82598465

博客原文內(nèi)容


在開(kāi)發(fā)的過(guò)程中 有時(shí)候可能會(huì)需要進(jìn)行應(yīng)用之間的跳轉(zhuǎn) 而跳轉(zhuǎn)又分為顯式意圖和隱式意圖
首先說(shuō)一下顯示意圖和隱式意圖的區(qū)別
  • 顯式意圖:
    明確指定組件名的Intent為顯示意圖,明確了Intent應(yīng)該傳遞給那個(gè)組件。
  • 隱式意圖:
    沒(méi)有明確指定組件名的Intent為隱式意圖。

顯示意圖多用于應(yīng)用內(nèi)到跳轉(zhuǎn) 也就是我們平時(shí)用的跳轉(zhuǎn)方式 而隱式意圖多用于多用于應(yīng)用間的跳轉(zhuǎn)*
因?yàn)轱@示意圖需要明確知道報(bào)名和類名才能進(jìn)行跳轉(zhuǎn) 而跳轉(zhuǎn)其他第三方應(yīng)用 很有可能不知道他的包名和類名 除非是合作應(yīng)用或者進(jìn)行了反編譯

假如 在知道包名類名的情況下 需要跳轉(zhuǎn)到第三方的應(yīng)用 就可以使用顯示意圖跳轉(zhuǎn) 下面是例子
假如我們要跳轉(zhuǎn)到瀏覽器搜索頁(yè)面 瀏覽器的包名是 com.android.browser
搜索頁(yè)面的類名為com.android.browser.BrowserActivity
那么有兩種方法可以實(shí)現(xiàn)

第一種:
           button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
                startActivity(intent);
                 }
        });

第二種:
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                ComponentName componentName=new ComponentName("com.android.browser", "com.android.browser.BrowserActivity");
                intent.setComponent(componentName);
                startActivity(intent);
            }
        });

如果在不知道指定的Activity界面類名的情況下就需要跳轉(zhuǎn)到指定的界面 這里需要隱式調(diào)用 依然是使用上面的包名
可以這樣寫(xiě)
通過(guò)action和category來(lái)進(jìn)行跳轉(zhuǎn)指定的界面(這兩個(gè)參數(shù)在應(yīng)用API文檔里面有標(biāo)注 或者 可以直接網(wǎng)上找)

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("android.intent.action.SEARCH");
                intent.addCategory("android.intent.category.DEFAULT");
                intent.setPackage("com.android.browser");
            }
        });

還有一種情況就是不需要跳轉(zhuǎn)到指定的界面 只需要打開(kāi)應(yīng)用 而且 只知道包名 怎么辦 別慌 這樣來(lái):

      button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = getPackageManager().getLaunchIntentForPackage("com.android.browser");
                startActivity(intent);
            }
        });

這里需要說(shuō)明一下Intent的setClass和setClassName的區(qū)別
setClass:跳轉(zhuǎn)到與該工程下的(同一個(gè)Application中的)activity或者service
setClassName:跳轉(zhuǎn)到不同Applicaiton的activity或者service


判斷手機(jī)上有沒(méi)有第三方應(yīng)用

 /**
     * 檢測(cè)
     *
     */
    public static void checkIsInstall(Context ctx, String packageName) {

        if ( !isAvilible( packageName , ctx ) ){
             //沒(méi)有安裝Apk
        }else {

            //已經(jīng)安裝了Apk
            Intent intent = new Intent();
            intent.setClassName(packageName, srcActivity);
            ctx.startActivity(intent);
        }


    }


    /**
     * 檢查是否安裝了某應(yīng)用
     *
     * @param packageName 包名
     * @return
     */
    public static boolean isAvilible(String packageName, Context mContext) {
        final PackageManager packageManager = mContext.getPackageManager();
        // 獲取所有已安裝程序的包信息
        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
        for (int i = 0; i < pinfo.size(); i++) {
            if (pinfo.get(i).packageName.equalsIgnoreCase(packageName))
                return true;
        }
        return false;
    }

注意點(diǎn)

如果加了上面的內(nèi)容,在 實(shí)現(xiàn)的過(guò)程中出現(xiàn)了如下的錯(cuò)誤:

Caused by: java.lang.SecurityException: Permission Denial: starting Intent { cmp=tecsun.jx.yt.phone/.MainActivity } from ProcessRecord{44299e68 11892:com.example.administrator.linkyingtandemo/u0a85} (pid=11892, uid=10085) not exported from uid 10482

這個(gè)應(yīng)該就是第三方的應(yīng)用沒(méi)有加許可跳轉(zhuǎn):android:exported="true"

        <activity
            android:exported="true"
            android:name="xxxxxxx.xxxx.xxx.xxx.MainActivity"
            android:configChanges="keyboardHidden|orientation"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" />
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、知識(shí)點(diǎn)回顧:Activity (一)、如何實(shí)現(xiàn)Activity頁(yè)面跳轉(zhuǎn)? 示例代碼: //第一種方式: Int...
    白話徐文濤閱讀 2,175評(píng)論 0 15
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,932評(píng)論 25 709
  • 你從一座叫我的小鎮(zhèn)經(jīng)過(guò) 剛好屋頂?shù)难┗捎觑h落 你穿著透明的衣服 給我一個(gè)人唱歌 全都是我喜歡的歌 譚維維的《如果...
    凱凱1219閱讀 301評(píng)論 0 0
  • 婚前看情感,婚后靠相處。 人人皆平等,人人都擁有幸福的權(quán)力。 1。唯有愛(ài)和夢(mèng)想不可辜負(fù)你想要的生活都會(huì)給你,卻也要...
    聚字成書(shū)閱讀 300評(píng)論 0 1
  • 2017漸行漸遠(yuǎn),數(shù)得到的日子,握不住的光陰。 年末,領(lǐng)導(dǎo)回給你談話,是不能缺少的功課。今天剛好我上班,領(lǐng)導(dǎo)說(shuō)下班...
    逆水而流閱讀 302評(píng)論 0 0

友情鏈接更多精彩內(nèi)容