文章部分内容转载于: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" />