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"
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- 泰拳居家打卡十九天