Android学习之ComponentName的使用
一、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的使用相关推荐
- 一篇文章一张思维导图看懂Android学习最佳路线
一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...
- Android学习路线总结
title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...
- Pro Android学习笔记(三三):Menu(4):Alternative菜单
什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供 ...
- Android:学习路线总结,绝对干货
转载请注明出处:http://blog.csdn.net/lowprofile_coding/article/details/51252781 一.前言 不知不觉自己已经做了几年开发了,由记得刚出来工 ...
- 【Monica的android学习之路】四大组件的生命周期
[Monica的android学习之路]四大组件的生命周期 1. Service 1.1 启动service 1.1.1 startService 1.1.2 bindService 1.2 死亡回调 ...
- Android学习笔记:Android基础知识点(不断更新中)
1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...
- Android学习路线总结,绝对干货
一.前言 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉好无知.懂的越多的时候你才会发现懂的越少. 如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大. ...
- Android学习之路4——音乐播放器后台播放
Android学习之路4--音乐播放器后台播放 一.实验题目 简单音乐播放器 二.实现内容 实现一个简单的播放器,要求功能有: 播放.暂停.停止.退出功能,按停止键会重置封面转角,进度条和播放按钮:按 ...
- Android学习路线指南,flutter登录页
比如四大组件如何使用.如何创建Service.如何进行布局.简单的自定义View.动画等常见技术 书籍推荐 <第一行代码 Android>.<疯狂Android> 中级工程师 ...
最新文章
- java 封箱_java封箱和拆箱分析
- 前端路由实现原理(history)
- Servlet JSP系列文章总结
- 软件类配置(四)【ubuntu16.04安装pycahrm】
- 51nod1122 机器人走方格 V4
- 【滤波器】基于matlab低通滤波器(LPF)设计【含Matlab源码 323期】
- linux分区文件ext4和ext3,在Windows 下读取 Linux 的 ext3/ext4 格式分区 -Ext2Read和Ext2Fsd...
- oracle 查询优化
- 击鼓传花c语言编程题,转身之间——此间的少年画蛇添足版
- eclipse和mysql餐厅点餐系统_基于安卓Android手机点餐APP系统的设计(Eclipse,MySQL)
- 治愈系书单|林曦《只生欢喜不生愁》
- 电脑键盘equals在哪个位置_学习第二步equals;equals;电脑键盘使用--快捷键大全
- JsonParser
- URP Bokeh DOF 分析
- 关于babel配置使用可选链
- 彩虹对接牛蛙WK插件,无授权
- AR增强现实 Augmented Reality
- 用Python画国旗
- 远程控制,我用MicroSoft 远程桌面连接
- ubuntu21.04换源
热门文章
- response对象以及cookie
- 运营和推广资讯类网站
- ppt幻灯片如何直接转换成pdf电子书
- 模拟银行卡冻结解冻时间
- SQL-timestampdiff()时间差函数
- vue 路由跳转报错 redirected when going from via a navigation guard
- R语言使用pweibull函数生成威布尔(韦伯分布)分布累积分布函数数据、使用plot函数可视化威布尔分布累积分布函数数据(Weibull Distribution)
- 文件夹变成git仓库怎么取消,本地文件夹变成有Gi图标的文件夹怎么取消
- Spring定义Bean的两种方式:<bean>和@Bean
- 小猫打喷嚏流眼泪是怎么回事