美文网首页android 技术知识
Android 跳转到第三方应用(应用间的跳转)

Android 跳转到第三方应用(应用间的跳转)

作者: 追梦小乐 | 来源:发表于2018-11-08 11:08 被阅读0次

    文章部分内容转载于:https://blog.csdn.net/qq_40967402/article/details/82598465

    博客原文内容


    在开发的过程中 有时候可能会需要进行应用之间的跳转 而跳转又分为显式意图和隐式意图
    首先说一下显示意图和隐式意图的区别
    • 显式意图:
      明确指定组件名的Intent为显示意图,明确了Intent应该传递给那个组件。
    • 隐式意图:
      没有明确指定组件名的Intent为隐式意图。

    显示意图多用于应用内到跳转 也就是我们平时用的跳转方式 而隐式意图多用于多用于应用间的跳转*
    因为显示意图需要明确知道报名和类名才能进行跳转 而跳转其他第三方应用 很有可能不知道他的包名和类名 除非是合作应用或者进行了反编译

    假如 在知道包名类名的情况下 需要跳转到第三方的应用 就可以使用显示意图跳转 下面是例子
    假如我们要跳转到浏览器搜索页面 浏览器的包名是 com.android.browser
    搜索页面的类名为com.android.browser.BrowserActivity
    那么有两种方法可以实现

    第一种:
               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界面类名的情况下就需要跳转到指定的界面 这里需要隐式调用 依然是使用上面的包名
    可以这样写
    通过action和category来进行跳转指定的界面(这两个参数在应用API文档里面有标注 或者 可以直接网上找)

            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");
                }
            });
    

    还有一种情况就是不需要跳转到指定的界面 只需要打开应用 而且 只知道包名 怎么办 别慌 这样来:

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

    这里需要说明一下Intent的setClass和setClassName的区别
    setClass:跳转到与该工程下的(同一个Application中的)activity或者service
    setClassName:跳转到不同Applicaiton的activity或者service


    判断手机上有没有第三方应用

     /**
         * 检测
         *
         */
        public static void checkIsInstall(Context ctx, String packageName) {
    
            if ( !isAvilible( packageName , ctx ) ){
                 //没有安装Apk
            }else {
    
                //已经安装了Apk
                Intent intent = new Intent();
                intent.setClassName(packageName, srcActivity);
                ctx.startActivity(intent);
            }
    
    
        }
    
    
        /**
         * 检查是否安装了某应用
         *
         * @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;
        }
    

    注意点

    如果加了上面的内容,在 实现的过程中出现了如下的错误:

    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

    这个应该就是第三方的应用没有加许可跳转:android:exported="true"

            <activity
                android:exported="true"
                android:name="xxxxxxx.xxxx.xxx.xxx.MainActivity"
                android:configChanges="keyboardHidden|orientation"
                android:launchMode="singleTask"
                android:screenOrientation="portrait" />
    

    相关文章

      网友评论

        本文标题:Android 跳转到第三方应用(应用间的跳转)

        本文链接:https://www.haomeiwen.com/subject/acgixqtx.html