一、ComponentName简介

ComponentName,顾名思义,就是组件名称,这个类主要用来定义一个应用程序的组件,通过调用Intent中的setComponent方法,我们可以打开同个应用以及不同应用中的组件。例如:Activity,Service。

二、ComponentName的使用

简单介绍完ComponentName,接下来来看看如何使用它。由于ComponentName实现了Parcelable接口,所以它可以实现跨进程通信。要使用ComponentName,我们需要了解它的构造函数。实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称getPackageName或者上下文Context,这个包名称是指清单文件中列出的应用的包名称。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.hjr.heidoulib"  //就是这里><application

第二个参数是你要启动的Activity或者Service的全称(包名+类名)。它的构造函数有三种,如下:

1、 第一种
/**
*@param pkg 组件存在的包的名称。该值不能为空,例如:"com.test.componentName"
* @param cls 需要在pkg 中的类的名称 例如:"com.test.componentName.MainActivity"
*/
public ComponentName(@NonNull String pkg, @NonNull String cls) {......}
2、第二种
/**
* @param pkg 实现组件的包的上下文 例如:MainActivity.this
* @param cls 需要在pkg 中的类的名称 例如:"com.test.componentName.MainActivity"
* 或者MainActivity.class.getName()
*/
public ComponentName(@NonNull Context pkg, @NonNull String cls) {......}
3、第三种
/**
* @param pkg 实现组件的包的上下文 例如:MainActivity.this
* @param cls 所需组件的类对象 例如:TestActivity.class
*/
public ComponentName(@NonNull Context pkg, @NonNull Class<?> cls) {......}

现在来写一个完成的实例。
首先是布局,很简单,只要实现一个开启Intent的按钮。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Button
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TestComponentName"android:onClick="startTestComponentName"/>
</LinearLayout>

接下来是写开启对应组件的逻辑,这里写了开启Activity以及Service两种组件。如下:

/*** 开始ComponentName测试*/public void startTestComponentName(View view){Intent intent = new Intent(); //创建Intent对象String pageName = getPackageName();//获取应用//第一种方式实现ComponentName componentName1 = new ComponentName(pageName,"com.hjr.heidoulib.module.activity.TestComponentNameActivity");//第二种方式实现ComponentName componentName2 = new ComponentName(MainActivity.this,"com.hjr.heidoulib.module.activity.TestComponentNameActivity");//第三种方式实现(实现的是Service)ComponentName componentName3 = new ComponentName(MainActivity.this,JobTestService.class);intent.setComponent(componentName1);//调用Intent的setComponent()方法实现传递startActivity(intent);//显示启动Activity}

这样子你就可以轻松的实现Intent+ComponentName来打开应用中不同的组件了。

三、需要注意的点。

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

<activity android:name=".module.activity.TestComponentNameActivity"android:label="TestComponentName"android:exported="true" //注意></activity><service
            android:name=".module.service.JobTestService"android:enabled="true"android:exported="true"//注意android:permission="android.permission.BIND_JOB_SERVICE" />

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

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

<activity android:name=".MainActivity"><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。

还有一个小技巧:如果你想知道当前手机显示了哪些在运行的任务栈,你可以在Android studio中的Terminal中输入 adb shell dumpsys activity activities。就会出现你想要的信息。我们可以关注 ActivityRecord{2290792d u0 com.hjr.heidoulib/.module.activity.TestComponentNameActivity t9}来获取当前应用所显示的界面的包名跟类名。

借鉴
https://blog.csdn.net/u012702547/article/details/49557905

Android学习之ComponentName的使用相关推荐

  1. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

  2. Android学习路线总结

    title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...

  3. Pro Android学习笔记(三三):Menu(4):Alternative菜单

    什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供 ...

  4. Android:学习路线总结,绝对干货

    转载请注明出处:http://blog.csdn.net/lowprofile_coding/article/details/51252781 一.前言 不知不觉自己已经做了几年开发了,由记得刚出来工 ...

  5. 【Monica的android学习之路】四大组件的生命周期

    [Monica的android学习之路]四大组件的生命周期 1. Service 1.1 启动service 1.1.1 startService 1.1.2 bindService 1.2 死亡回调 ...

  6. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  7. Android学习路线总结,绝对干货

    一.前言 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉好无知.懂的越多的时候你才会发现懂的越少. 如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大. ...

  8. Android学习之路4——音乐播放器后台播放

    Android学习之路4--音乐播放器后台播放 一.实验题目 简单音乐播放器 二.实现内容 实现一个简单的播放器,要求功能有: 播放.暂停.停止.退出功能,按停止键会重置封面转角,进度条和播放按钮:按 ...

  9. Android学习路线指南,flutter登录页

    比如四大组件如何使用.如何创建Service.如何进行布局.简单的自定义View.动画等常见技术 书籍推荐 <第一行代码 Android>.<疯狂Android> 中级工程师 ...

最新文章

  1. java 封箱_java封箱和拆箱分析
  2. 前端路由实现原理(history)
  3. Servlet JSP系列文章总结
  4. 软件类配置(四)【ubuntu16.04安装pycahrm】
  5. 51nod1122 机器人走方格 V4
  6. 【滤波器】基于matlab低通滤波器(LPF)设计【含Matlab源码 323期】
  7. linux分区文件ext4和ext3,在Windows 下读取 Linux 的 ext3/ext4 格式分区 -Ext2Read和Ext2Fsd...
  8. oracle 查询优化
  9. 击鼓传花c语言编程题,转身之间——此间的少年画蛇添足版
  10. eclipse和mysql餐厅点餐系统_基于安卓Android手机点餐APP系统的设计(Eclipse,MySQL)
  11. 治愈系书单|林曦《只生欢喜不生愁》
  12. 电脑键盘equals在哪个位置_学习第二步equals;equals;电脑键盘使用--快捷键大全
  13. JsonParser
  14. URP Bokeh DOF 分析
  15. 关于babel配置使用可选链
  16. 彩虹对接牛蛙WK插件,无授权
  17. AR增强现实 Augmented Reality
  18. 用Python画国旗
  19. 远程控制,我用MicroSoft 远程桌面连接
  20. ubuntu21.04换源

热门文章

  1. response对象以及cookie
  2. 运营和推广资讯类网站
  3. ppt幻灯片如何直接转换成pdf电子书
  4. 模拟银行卡冻结解冻时间
  5. SQL-timestampdiff()时间差函数
  6. vue 路由跳转报错 redirected when going from via a navigation guard
  7. R语言使用pweibull函数生成威布尔(韦伯分布)分布累积分布函数数据、使用plot函数可视化威布尔分布累积分布函数数据(Weibull Distribution)
  8. 文件夹变成git仓库怎么取消,本地文件夹变成有Gi图标的文件夹怎么取消
  9. Spring定义Bean的两种方式:<bean>和@Bean
  10. 小猫打喷嚏流眼泪是怎么回事