安卓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,如果想从其他应用打开,也都要加上这个属性:

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

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

入口Activity不需要加此属性的原因是:

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

        <activity
            android: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-data
                android:name="meta_act"
                android:resource="@string/app_name" />
        </activity>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

必应bing国内广告开户注册教程!

今天搜索引擎广告成为企业推广产品与服务、提升品牌知名度的重要渠道之一。作为全球第二大搜索引擎&#xff0c;必应Bing凭借其高质量的用户群体和广泛的国际覆盖&#xff0c;为广告主提供了独特的市场机遇。在中国&#xff0c;虽然必应的市场份额相对较小&#xff0c;但对于寻…

鸿蒙官网学习3

鸿蒙官网学习3 每日小提示项目的模块类型跨设备预览调试阶段应用的替换方式有两种 打开老的demo工程报错UIAbility 每日小提示 项目的模块类型 moduleType分为三种&#xff0c;只有1&#xff0c;2的模块支持直接调试和运行 entryfeaturehar 跨设备预览 需要手动在config.j…

在开发软件以便未来本地化到其他语言时需要考虑的事项

我们准备了一份关于开发软件以便未来本地化到其他语言时需要考虑的事项的简要指南。这非常重要&#xff0c;因为您的软件在其他国家市场上的销售可能会带来比本国市场更多的收入。 在开发软件时考虑到未来本地化到其他语言的一些重要方面包括&#xff1a; 设计多语言支持&…

C++—DAY4

在Complex类的基础上&#xff0c;完成^&#xff0c;<<&#xff0c;>>&#xff0c;~运算符的重载 #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){}Complex(int rel,int vir):rel(rel),vir(vir){}void show(){c…

【每日刷题】Day26

【每日刷题】Day26 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. [NOIP2008]笨小猴_牛客题霸_牛客网 (nowcoder.com) 2. 添加逗号_牛客题霸_牛客网 (nowcoder.com) …

windows/linux 安装php的 sql server 扩展

Windowsphpstudyphp7.1 下载&#xff1a;ODBC、下载php 的sql server 扩展 路径&#xff1a;下载地址 版本&#xff1a;我的是7.1 对应的ODBC 是13&#xff0c;php 的sql server 扩展为4.3 安装&#xff1a;msodbcsql 直接安装、sqlsrv43 安装完把 扩展复制到php71 的扩展文…

Python脚本抢票【笔记】

Python脚本抢票【笔记】 前言版权推荐Python脚本抢票【Python】microsoft edge驱动器下载以及使用最后 前言 2024-4-17 18:19:15 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是ht…

Unity WebGL 转换微信小游戏方案

方案特点 保持原引擎工具链与技术栈无需重写游戏核心逻辑&#xff0c;支持大部分第三方插件由转换工具与微信小游戏运行环境保证适配兼容&#xff0c;保持较高还原度微信小游戏平台能力以C# SDK方式提供给开发者&#xff0c;快速对接平台开放能力 技术原理 Unity的BuildTarget支…

【RocketMQ知识点总结-1】

文章目录 RocketMQ介绍RocketMQ架构&#xff1a;NameServer:BrokerProducerTopic&#xff08;主题&#xff09;&#xff1a;Queue&#xff08;队列&#xff09;&#xff1a;Message&#xff08;消息&#xff09;&#xff1a; RocketMQ的工作流程RocketMQ的使用场景异步消息传递…

【数据结构】Map和Set(1)

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

【c++】探究C++中的list:精彩的接口与仿真实现解密

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章来到list有关部分&#xff0c;这一部分函数与前面的类似&#xff0c;我们简单讲解&#xff0c;重难点在模拟实现时的迭代器有关实现 目录 1.List介绍2.接…

【博特激光】激光焊接机在塑料领域的应用

激光焊接机在塑料领域的应用已经越来越广泛&#xff0c;这主要得益于其独特的优势和特性。激光焊接机利用激光束产生高能量、高温的条件&#xff0c;将塑料材料熔化并融合在一起&#xff0c;实现焊接的目的。 在塑料领域&#xff0c;激光焊接机主要用于各种塑料制品的焊接&…

【项目分享】用 Python 写一个桌面倒计日程序!

事情是这样的&#xff0c;我们班主任想委托我做一个程序&#xff0c;能显示还有几天考试。我立即理解了这个意思&#xff0c;接下了这个项目。 话不多说&#xff0c;来看看这个项目吧—— 项目简介 仓库地址&#xff1a;https://gitee.com/yaoqx/desktop-countdown-day 这是 …

C语言入门课程学习笔记-6

C语言入门课程学习笔记-6 第27课 - 字符数组与字符串&#xff08;上&#xff09;第28课 - 字符数组与字符串&#xff08;下&#xff09;第29课 - 数组专题练习&#xff08;上&#xff09;第30课 - 数组专题练习&#xff08;下&#xff09; 本文学习自狄泰软件学院 唐佐林老师的…

matplotlib 安装失败:Failed building wheel for matplotlib 解决方案

Python | Failed building wheel for matplotlib 朋友遇到 python 安装 matplotlib 时的问题&#xff0c;笔者帮忙远程调试(踩了不少坑)。网上的解决方案有很多无效&#xff0c;以此来记录以下个人解决方案。 在使用指令 pip install matplotlib出现如下报错&#xff1a; “…

移远通信再推系列高性能卫星、5G、GNSS及三合一组合天线

4月23日&#xff0c;全球领先的物联网整体解决方案供应商移远通信正式宣布&#xff0c;再次推出多款高性能天线产品&#xff0c;以进一步满足物联网市场对高品质天线产品的需求。 其中包括卫星天线YETN001L1A、三合一组合天线YEMA300QXA和YEMN302Q1A&#xff0c;外部5G天线YECN…

Unity对应的c#版本

本文主要是记录一下unity已经开始兼容c#的版本和.net版本&#xff0c;以便更好的利用c#的特性。 c#和.net对应情况 微软已经将.net开发到.net 9了&#xff0c;但是unity的迭代速度远没有c#迭代速度快&#xff0c;已知unity最新的LTS版本unity2023已经兼容了c#9 可以在unity手册…

生成数据能否帮助模型训练?

能否利用生成模型生成的假数据来辅助学习&#xff1f; 到底是可以左脚踩右脚&#xff08;bootsrap&#xff09;地实现 weak-to-strong 的不断提升&#xff0c;还是像鸡生蛋、蛋生鸡一样&#xff0c;只不过是徒劳无功&#xff1f; 论文题目&#xff1a; Do Generated Data Alw…

集成学习算法学习笔记

一、集成学习的基本思想 三个臭皮匠顶一个诸葛亮 集成学习会考虑多个评估器的建模结果&#xff0c;汇总后得到一个综合的结果&#xff0c;以此来获取比单个模型更好的回归或分类表现。 很多独立的机器学习算法&#xff1a;决策树、神经网络、支持向量机 集成学习构建了一组基…

如何在iPhone/iPad上恢复已删除的微信消息?

“我从我的iPhone上删除了一些微信消息。我想知道我是否可以从我的iPhone上恢复已删除的微信消息。我尝试了一些方法&#xff0c;但没有一个可以恢复我丢失的消息&#xff0c;只能恢复我的短信。谁可以给我有什么建议吗&#xff1f;” ——蒂娜 如何在iPhone或iPad上恢复已删除…
最新文章