安卓ComponentName简介及使用

目录

  • 一、ComponentName是什么?
  • 二、类分析
    • 2.1 构造方法
    • 2.2 重点方法
  • 三、ComponentName的使用


一、ComponentName是什么?

ComponentName,顾名思义,就是组件名称,用于表示Android应用程序组件的名称。在Android开发中,每个应用程序组件(如Activity、Service、BroadcastReceiver等)都有一个唯一的组件名称,用于标识该组件在Android系统中的位置。

ComponentName类的主要作用是用于创建和管理Android应用程序组件的名称。

通过ComponentName对象,可以获取组件的包名和类名,还可以比较两个ComponentName对象的大小关系。
同时,ComponentName类还实现了Parcelable接口,可以在不同组件之间传递ComponentName对象。
在Android开发中,ComponentName类通常用于与Android系统进行交互,如启动其他应用程序的组件、获取应用程序组件的信息等。
通过ComponentName类,开发者可以方便地操作和管理Android应用程序组件的名称,实现更灵活的应用程序设计。


二、类分析

public final class ComponentName implements Parcelable, Cloneable, Comparable<ComponentName> {

由于实现了Parcelable、Cloneable和Comparable< ComponentName>接口,ComponentName类具有了序列化、克隆和比较功能。

2.1 构造方法

   public ComponentName(@NonNull String pkg, @NonNull String cls) {if (pkg == null) throw new NullPointerException("package name is null");if (cls == null) throw new NullPointerException("class name is null");mPackage = pkg;mClass = cls;}public ComponentName(@NonNull Context pkg, @NonNull String cls) {if (cls == null) throw new NullPointerException("class name is null");mPackage = pkg.getPackageName();mClass = cls;}public ComponentName(@NonNull Context pkg, @NonNull Class<?> cls) {mPackage = pkg.getPackageName();mClass = cls.getName();}

public ComponentName(@NonNull String pkg, @NonNull String cls)
通过给定的包名和类名创建一个新的ComponentName对象。
如果包名或类名为null,则会抛出NullPointerException异常。
参数:
pkg:包名
cls:类名

public ComponentName(@NonNull Context pkg, @NonNull String cls)
通过给定的Context对象和类名创建一个新的ComponentName对象。
从Context对象中获取实际的包名。
如果类名为null,则会抛出NullPointerException异常。
参数:
pkg:实现组件的包的Context对象
cls:类名

public ComponentName(@NonNull Context pkg, @NonNull Class<?> cls)
通过给定的Context对象和Class对象创建一个新的ComponentName对象。
从Context对象中获取实际的包名,从Class对象中获取实际的类名。
参数:
pkg:实现组件的包的Context对象
cls:所需组件的Class对象

三个构造方法提供了不同的方式来创建ComponentName对象,开发者可以根据需要选择合适的构造方法来实例化ComponentName对象。通过这些构造方法,可以方便地创建表示Android应用程序组件的名称的ComponentName对象,并在应用程序中进行相关操作。

2.2 重点方法

	 // 获取包名public @NonNull String getPackageName() {return mPackage;}// 获取类名public @NonNull String getClassName() {return mClass;}//该方法用于获取组件的短类名,即去除包名后的类名部分。public String getShortClassName() {if (mClass.startsWith(mPackage)) {int PN = mPackage.length();int CN = mClass.length();if (CN > PN && mClass.charAt(PN) == '.') {return mClass.substring(PN, CN);}}return mClass;}//通过createRelative()方法,可以根据给定的包名和类名创建一个相对的ComponentName对象。public static @NonNull ComponentName createRelative(@NonNull String pkg, @NonNull String cls) {if (TextUtils.isEmpty(cls)) {throw new IllegalArgumentException("class name cannot be empty");}final String fullName;if (cls.charAt(0) == '.') {// Relative to the package. Prepend the package name.fullName = pkg + cls;} else {// Fully qualified package name.fullName = cls;}return new ComponentName(pkg, fullName);}

三、ComponentName的使用

ComponentName实例化组件
第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称:
第二个参数是你要启动的Activity或者Service的全称(包名+类名),代码如下:

启动一个Activity:

   Intent intent = new Intent();intent.setComponent(new ComponentName("com.android.henrytest", "com.android.henrytest.MainActivity"));startActivity(intent);

启动一个Service:

	Intent it = new Intent();it.setComponent(new ComponentName("com.example.otherapp","com.example.otherapp.MyService"));startService(it);

注意:
如果要启动的其他应用的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不需要加此属性的原因是:

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

        <activityandroid:name="com.android.henrytest.iccpanelActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-dataandroid:name="meta_act"android:resource="@string/app_name" /></activity>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

航空企业数字化解决方案(207页PPT)

一、资料描述 航空企业数字化解决方案是一项针对航空公司在数字化转型过程中所面临挑战的全面应对策略&#xff0c;旨在通过先进的信息技术提升航空企业的运营效率、客户服务水平以及市场竞争力。这份207页的PPT详细介绍了航空企业数字化的各个方面&#xff0c;包括关键技术的…

Web3技术解析:区块链在去中心化应用中的角色

引言 在过去几年中&#xff0c;Web3技术已经成为了互联网领域的一个热门话题。作为区块链技术的延伸&#xff0c;Web3不仅仅是数字货币的代名词&#xff0c;更是一个能够为各种应用提供去中心化解决方案的强大工具。本文将深入探讨区块链在Web3去中心化应用中的关键角色&#…

ubuntu查看opencveigen

ubuntu查看opencv&eigen&cmake版本的方法 eigen eigen版本号在/usr/include/eigen3/Eigen/src/Core/util/Macros.h文件中&#xff0c;下图代表版本3.3.7 opencv版本 pkg-config --modversion opencv4也可能最后的字符串是opencv2&#xff0c;opencv

R语言 数据框的长、宽格式转换

Converting data between wide and long format 在宽、长格式之间转换数据 R语言中的大多数函数希望数据是长格式 但是&#xff0c;像 SPSS 通常使用宽格式数据 当你想把将数据从宽转换为长格式 常用的有两种方法&#xff1a; 1、gather() 和 spread() 来自 tidyr 包。 2、me…

W801学习笔记十二:掌机进阶V3版本之驱动(PSRAM/SD卡)

本次升级添加了两个模块&#xff0c;现在要把他们驱动起来。 一&#xff1a;PSRAM 使用SDK自带的驱动&#xff0c;我们只需要写一个初始化函数&#xff0c;并在其中添加一些自检代码。 void psram_heap_init(){wm_psram_config(0);//实际使用的psram管脚选择0或者1&#xff…

美团:搜索推荐算法工程师

目录 机器学习、深度学习和强化学习 迁移学习: 强化学习: 可解释性推荐:

中小学生如何开始创办谷歌?

现在财富自由这个词很火&#xff0c;因为每个人都想让自己能够摆脱朝九晚五工作的束缚。而通往财富自由的最佳路径——那就是创办自己的公司。 这不仅仅是关于金钱&#xff0c;更是关于掌控自己的未来&#xff0c;实现个人价值的最大化。 你是否曾梦想过自己的创意能够颠覆整…

Java学习路线及自我规划

荒废了一段时间&#xff0c;这段时间的总结开始了JavaWeb的学习但是困难重重&#xff0c;例如Maven&#xff0c;Vue的路由等&#xff0c;所以我反省了一段时间&#xff0c;因为基础薄弱&#xff0c;加之学习的资源是速成视频&#xff0c;导致大厦将倾的局面&#xff08;也算不上…

RabbitMQ工作模式(5) - 主题模式

概念 主题模式&#xff08;Topic Exchange&#xff09;是 RabbitMQ 中一种灵活且强大的消息传递模式&#xff0c;它允许生产者根据消息的特定属性将消息发送到一个交换机&#xff0c;并且消费者可以根据自己的需求来接收感兴趣的消息。主题交换机根据消息的路由键和绑定队列的路…

RabbitMQ的理论知识点,和使用RabbitMQ时常见的问题点【理论】!

不管使用任何语言调用RabbitMQ 一般都会存在各种问题&#xff0c;我整理了一下 我觉得会遇到的常见问题&#xff0c;并记录了 解决思路 。没有提供具体代码&#xff0c;后续有时间写个代码体会一下&#xff0c;实际有了解决思路&#xff0c;百度里有很多代码让我们使用。哈哈 …

盲人地图使用的革新体验:助力视障人士独立、安全出行

在我们日常生活中&#xff0c;地图导航已经成为不可或缺的出行工具。而对于盲人群体来说&#xff0c;盲人地图使用这一课题的重要性不言而喻&#xff0c;它不仅关乎他们的出行便利性&#xff0c;更是他们追求生活独立与品质的重要一环。 近年来&#xff0c;一款名为蝙蝠…

代码随想录算法训练营第三十八天| 动态规划,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

目录 动态规划 题目链接&#xff1a; 509. 斐波那契数 思路 代码 题目链接&#xff1a; 70. 爬楼梯 思路 代码 题目链接&#xff1a; 746. 使用最小花费爬楼梯 思路 代码 总结 动态规划 Dynamic programming&#xff0c;DP问题。某一问题包含很多重叠的子问题&#x…

echarts地图叠加百度地图底板实现数据可视化

这里写自定义目录标题 echarts地图叠加百度地图实现数据可视化echarts地图叠加百度地图实现数据可视化 实现数据可视化时,个别情况下需要在地图上实现数据的可视化,echarts加载geojson数据可以实现以地图形式展示数据,例如分层设色或者鼠标hover展示指标值,但如果要将echa…

React 之 组件模块依赖

导入&#xff08;Import&#xff09;和导出&#xff08;exporing&#xff09;组件 在一个文件中声明多个组件&#xff0c;但是文件变得太大的话就不方便查看了。要解决此问题&#xff0c;你可以将一个组件放到一个单独的文件中并&#xff08;导出&#xff09; export 组件&…

运筹系列91:vrp算法包PyVRP

1. 介绍 PyVRP使用HGS&#xff08;hybrid genetic search&#xff09;算法求解VRP类问题。在benchmark上的评测结果如下&#xff0c;看起来还不错&#xff1a; 2. 使用例子 2.1 CVRP COORDS [(456, 320), # location 0 - the depot(228, 0), # location 1(912, 0), …

C++进阶之路——关键字

C进阶——关键字 本系列博客主要对于已经有一定C/C基础的网友&#xff0c;欢迎志同道合的朋友来进行纯粹的技术交流&#xff01;&#xff01;&#xff01; 一、const 在C中&#xff0c;const 关键字是一个非常重要的特性&#xff0c;用于定义变量或对象的值为常量&#xff0c;…

通往AGI路上,DPU将如何构建生成式AI时代的坚实算力基石?

4月19日&#xff0c;在以“重构世界 奔赴未来”为主题的2024中国生成式AI大会上&#xff0c;中科驭数作为DPU新型算力基础设施代表&#xff0c;受邀出席了中国智算中心创新论坛&#xff0c;发表了题为《以网络为中心的AI算力底座构建之路》主题演讲&#xff0c;勾勒出在通往AGI…

Xcode 15构建问题

构建时出现的异常&#xff1a; 解决方式&#xff1a; 将ENABLE_USER_SCRIPT_SANDBOXING设为“no”即可&#xff01;

GateWay具体的使用!!!

一、全局Token过滤器 在Spring Cloud Gateway中&#xff0c;实现全局过滤器的目的是对所有进入系统的请求或响应进行统一处理&#xff0c;比如添加日志、鉴权等。下面是如何创建一个全局过滤器的基本步骤&#xff1a; 步骤1: 创建过滤器类 首先&#xff0c;你需要创建一个实现…

表---商场 nine

CREATE TABLE gao25 (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,shopId int(11) NOT NULL COMMENT 店铺ID,goodsId int(11) NOT NULL COMMENT 商品ID,attrId int(11) NOT NULL COMMENT 属性名称,attrVal text NOT NULL COMMENT 属性值,createTime datetime NOT NULL …