ComponentName是安卓提供给我们的通过A应用启动B应用的一个类,与Intent同位于Android.content包下,这个类主要用来定义可见一个应用程序组件,例如:Activity,Service,BroadcastReceiver或者ContentProvider。
这是ComponentName的构造函数:ComponentName(String pkg,String cls)
在Android中详细描述一个组件,我们需要知道该组件所在的应用包名,也就是在AndroidManifest.xml文件中manifest根结点下的package=“com.XXXXX.XXXXX",还有组件在应用程序中的完整路径名,拿Activity来说,也就是activity节点中name属性的值,如

mActivityName = "com.XxX.XXX.activity.diagnose.DiagnoseActivity"

所以ComponentName可以用来封装一个组件的应用包名和组件的名字

我们已经知道,在Android中组件之间的交流往往使用意图(Intent)来完成的,那么在Intent中有一个方法可以封装一个ComponentName,最后我们在使用意图去完成我们需要实现的功能。下面来讲一下ComponentName如何使用。

Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用。一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动(其中className是指完整的类名):
启动目标APP的主页面

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);

启动目标APP的内部普通页面

      ComponentName cn = new ComponentName(mPackageName, mActivityName);try {Intent intent = new Intent();Bundle bundle = new Bundle();bundle.putString("type", "1");//传递值intent.putExtras(bundle);intent.setComponent(cn);startActivityForResult(intent, REQUEST_ID);//等待目标页面返回的结果} catch (Exception e) {e.printStackTrace();}

但是有的时候,我们一般都不知道应用程序的启动Activity的类名,而只知道包名,我们可以通过ResolveInfo类来取得启动Acitivty的类名。

    private void openApp(String packageName) {PackageInfo pi = getPackageManager().getPackageInfo(packageName, 0);Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);resolveIntent.setPackage(pi.packageName);List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);ResolveInfo ri = apps.iterator().next();if (ri != null) {String packageName = ri.activityInfo.packageName;String className = ri.activityInfo.name;Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);ComponentName cn = new ComponentName(packageName, className);intent.setComponent(cn);startActivity(intent);}}

Android:exported

     一个activity是否能被其他app的组件启动– “true”能,“false”不能。如果是“false”,这个activity只能被相同app的组件启动,或者是相同user ID的app的组件启动。

注意

如果你要的启动的其他应用的Activity不是该应用的入口Activity,那么在清单文件中,该Activity节点一定要加上android:exported=“true”,表示允许其他应用打开,对于所有的Service,如果想从其他应用打开,也都要加上这个属性:

        <serviceandroid:name="com.example.otherapp.MyService"android:exported="true" ></service><activityandroid:name="com.example.otherapp.MainActivity2"android:exported="true" ></activity>

对于除了入口Activity之外的其他组件,如果不加这个属性,都会抛出“java.lang.SecurityException: Permission Denial…”异常

那么为什么入口Activity不用添加这个属性就可以被其他应用启动呢?我们来看一段入口Activity的注册代码:

        <activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

入口Activity和普通Activity唯一不同的地方就是入口Activity多了一个过滤器,对于包含了过滤器的组件,意味着该组件可以提供给外部的其他应用来使用,它的exported属性默认为true,相反,如果一个组件不包含任何过滤器,那么意味着该组件只能通过指定明确的类名来调用,也就是说该组件只能在应用程序的内部使用,在这种情况下,exported属性的默认值是false。

转载自:https://blog.csdn.net/u012532559/article/details/52766348
https://blog.csdn.net/u012702547/article/details/49557905/

ComponentName的使用相关推荐

  1. android componentname activity,ComponentName的使用

    ComponentName是安卓提供给我们的通过A应用启动B应用的一个类,与Intent同位于Android.content包下,这个类主要用来定义可见一个应用程序组件,例如:Activity,Ser ...

  2. Intent七在属性之一:ComponentName

    注:在<疯狂android讲义>中,此属性称为Component,官方文档中称为ComponentName. 1.The name of the component that should ...

  3. android 启动第三方程序的代码(利用ComponentName)

    转自:http://blog.csdn.net/vrix/article/details/6851557  在Intent中可以直接使用Intent.setClass() 也可以使用组件Compone ...

  4. Androd开发之通过ComponentName和setComponent以及scheme打开外部应用 | 打开任意页面 | 打开指定页面

    咱们老套路先看下效果图: 如果公司给你这个需求,让你们公司APP打开第三方APP进行别的操作,类似微信支付,你的APP打开微信的支付页面这个需求.咱们就可以用今天的ComponentName来实现这个 ...

  5. ComponentName的意思

    ComponentName是用来打开其它应用程序中的Activity或服务的. 使用方法: Intent i=new Intent(); i.setComponent(new ComponentNam ...

  6. ComponentName知识

    以下是ComponentName的API /*** Create a new component identifier from a Context and Class object.* * @par ...

  7. ComponentName

    ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务. 实例化一个ComponentName需 ...

  8. Android中关于ComponentName的使用

    Android中Intent对象提供许多属性: ComponentName Action Flags Extras Catgory Data 其中,ComponentName可以启动Activity. ...

  9. 关于使用ComponentName连接俩个Activity运行闪退的问题

    报错:运行后闪退 报错原因:查看ComponentName的传参错误,第一个参数传入的是启动应用的包名称,必须是全包名,第二个传入的参数是包名 + 类名 解决方法:本人包名没有写全,修改参数中的包名后 ...

  10. Android ComponentName的使用

    ComponentName顾名思义是组件的名称,可以启动其他应用的Activity.Service. ComponentName chatActivity =new ComponentName(par ...

最新文章

  1. 【Vegas原创】更改域用户的IE默认首页
  2. 第六次作业(C语言)
  3. 前端学习(927):淘宝flexiblejs源码分析之pageshow原理
  4. google 确定某点海拔高_一份“高投资回报率”的用户体验度量方法指南
  5. Android多线程之IntentService源码解析
  6. imax 6UI的按键输入子系统input 注意点
  7. linux mentohust dhcp,Ubuntu下Mentohust的配置
  8. DailyFi - 9.2 |Loot,黑纸白字?
  9. 小学用计算机画画的课件,小学信息技术绘图课件
  10. android webview 横竖屏_Android 切换横竖屏
  11. elasticsearch索引、文档、映射等概念
  12. 本地配置多个 Git 账户信息,满足不同的 Git 平台
  13. 如何查看SQL Server的索引碎片情况并进行整理
  14. f4v转换器怎么将f4v格式转换为flv格式
  15. 架设局域网升级服务器 用WSUS打补丁
  16. 记录一次清理挖矿程序
  17. word打开wps文件乱码_Word打开WPS文档成乱码怎么办
  18. Chrome上最好用的广告拦截插件:AdBlock
  19. I/O端口的简单应用
  20. 单车模型下方向盘转角与转弯半径关系

热门文章

  1. 【课设生成器】我做了一个代码生成器
  2. 从零开始的React学习(一)
  3. 网教20. 猜-丁-壳!
  4. repeater 控件ajax绑定数据源,【ASP.NET】第九课——使用DataList控件和Repeater控件绑定数据...
  5. 2021年施工升降机司机模拟考试题库-百分百安全生产模拟考试平台
  6. 代码复现:REV2: Fraudulent User Prediction in Rating Platforms
  7. kotlin中EditText赋值Type mismatch
  8. 第14课:spark RDD解密学习笔记
  9. Chromatix_AEC—exposure table
  10. java enum valueof_Java 解决Enum.valueOf找不到枚举出现的异常