android基础知识---不同app的跳转,及进程的控制
来源:互联网 发布:php倒计时提示 编辑:程序博客网 时间:2024/06/06 07:19
这里我简单介绍下跳转的三个方式,直接上方法了
1、已知包名直接按包名跳转
Intent intent = getPackageManager().getLaunchIntentForPackage("com.example.admin.tiaoapp2"); if (intent){ startActivity(intent); }
2、已知包名和activity和包名跳转(Intent.setComponent())
Intent intent = new Intent(); ComponentName componentName=new ComponentName("com.example.admin.tiaoapp2","com.example.admin.tiaoapp2.MainActivity"); intent.setComponent(componentName); startActivity(intent);
这里你可以看到我没做非空判断
下面是网上流传的非常普遍的用法:
String package_name = "xx.xx.xx";String activity_path = "xx.xx.xx.ab.xxActivity";Intent intent = new Intent();intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//可选ComponentName cn = new ComponentName(package_name,activity_path);intent.setComponent(cn);if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent);} else { //找不到指定的 Activity}
但是经验证,Intent.resolveActivity() 方法并不能判定此方式所要启动的 Activity 是否存在,如果此 Activity 不存在,会报 Java.lang.IllegalArgumentException: Unknown component 异常,并导致程序崩溃。
所以我选择用resolveActivityInfo,这两种方法非常相似,咱们对比下源码
public ComponentName resolveActivity(PackageManager pm) { if (mComponent != null) { return mComponent; } ResolveInfo info = pm.resolveActivity(this, PackageManager.MATCH_DEFAULT_ONLY); if (info != null) { return new ComponentName( info.activityInfo.applicationInfo.packageName, info.activityInfo.name); } return null;}public ActivityInfo resolveActivityInfo(PackageManager pm, int flags) { ActivityInfo ai = null; if (mComponent != null) { try { ai = pm.getActivityInfo(mComponent, flags); } catch (PackageManager.NameNotFoundException e) { // ignore } } else { ResolveInfo info = pm.resolveActivity(this, PackageManager.MATCH_DEFAULT_ONLY | flags); if (info != null) { ai = info.activityInfo; } } return ai;}
显而易见,resolveActivityInfo最后还是调用了resolveActivity,但是其内部做了处理和判断不会报IllegalArgumentException
所以最后的使用方式
Intent intent = new Intent(); ComponentName componentName=new ComponentName("com.example.admin.tiaoapp2","com.example.admin.tiaoapp2.MainActivity");intent.setComponent(componentName);if (intent.resolveActivityInfo(getPackageManager(), PackageManager.MATCH_DEFAULT_ONLY) != null) { startActivity(intent);}
3、已知包名跳转遍历找到activity跳转
private void doStartApplicationWithPackageName(String packagename) { // 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等 PackageInfo packageinfo = null; try { packageinfo = getPackageManager().getPackageInfo(packagename, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } if (packageinfo == null) { return; } // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); resolveIntent.setPackage(packageinfo.packageName); // 通过getPackageManager()的queryIntentActivities方法遍历 List<ResolveInfo> resolveinfoList = getPackageManager() .queryIntentActivities(resolveIntent, 0); ResolveInfo resolveinfo = resolveinfoList.iterator().next(); if (resolveinfo != null) { // packagename = 参数packname String packageName = resolveinfo.activityInfo.packageName; // 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname] String className = resolveinfo.activityInfo.name; // LAUNCHER Intent Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); Log.e("测试 :","packageName:"+packageName+" className:"+className); // 设置ComponentName参数1:packagename参数2:MainActivity路径 ComponentName cn = new ComponentName(packageName, className); intent.setComponent(cn); startActivity(intent); }
这里小tips下进程:
如果按包名跳转会有两个进程,但是如果按activity跳转则 只有一个进程。(我就是掉坑了—。——)
4隐式启动第三方应用
这里在说下隐式启动第三方应用
此方式多用于启动系统中的功能性应用,比如打电话、发邮件、预览图片、使用默认浏览器打开一个网页等。
Intent intent = new Intent();intent.setAction(action);intent.addCategory(category);intent.setDataAndType("abc://www.dfg.com","image/gif");startActivity(intent);
条件1:IntentFilter 至少有一个action 至少有一个Category 可以没有Data和Type条件2:如果有Data,参数中Data必须符合Data规则条件3:Action和Category必须同时匹配Activity中的一个Action和一个Category(Category 默认:android.intent.category.DEFAULT)
阅读全文
0 0
- android基础知识---不同app的跳转,及进程的控制
- android基础知识---不同app的跳转传值
- android Viewpage app 不同模块之间跳转的问题。
- Android:同一App不同Activity间跳转踩过的坑
- APP跳转 及iOS10的设置页面
- Android不同程序间的简单跳转
- Android App跳转App以及App跳转指定App页面的实现
- Android两个App之间跳转的方法
- Android中两个APP间跳转导致的异常问题及解决办法
- Android 神奇的一个app跳转到另一个app
- Android基础知识回顾---进程的优先级
- 进程控制1——关于进程控制的一些基础知识
- Android根据不同身份配置APP对应的不同模块
- 推进:从Linux进程基础知识过渡到进程的控制与进程间的通信
- linux进程及系统服务的控制
- android 不同进程之间的消息传递
- android不同进程之间的数据传递
- Android不同进程间的访问AIDL
- 朴素贝叶斯
- 集合中null和size==0的区别
- Cucumber概念解析与Java入门实例 (下)
- 携程Android App插件化和动态加载实践
- 文件系统层次标准FHS的详细介绍
- android基础知识---不同app的跳转,及进程的控制
- 【通信方式五】socket编程之TCP通信
- Android UI 切图命名规范、标注规范及单位描述
- (考试)2017年大一下学期C++期末考试题目四
- 使用response实现一些小功能
- 面试:android图片中的三级缓存
- 51nod 1068 Bash游戏 V3(找规律)
- 20170711
- CodeForces 820B Mister B and Angle in Polygon