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

文章部分内容转载于: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 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|Android 跳转到第三方应用(应用间的跳转)】这个应该就是第三方的应用没有加许可跳转:android:exported="true"

    推荐阅读