必威体育Betway必威体育官网
当前位置:首页 > IT技术

Android学习之ComponentName的使用

时间:2019-05-30 07:42:02来源:IT技术作者:seo实验室小编阅读:83次「手机版」
 

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

相关阅读

爱淘宝的每日红包链接在哪?爱淘宝红包怎么使用?

今天seo实验室小编要来给各位讲述的内容是爱淘宝的每日红包链接在哪?爱淘宝红包怎么使用?如果大家感兴趣的话,那就跟上小编我的脚

相机参数标定(camera calibration)及标定结果如何使用

一直都想写一写这个主题,但是,一直都感觉有点虚,也没有去整理。在网上搜了一下,发现大多数都是转来转去,看着也是似懂非懂的,让人很老火

我的rokid的使用经验

备注:更多资料尽在开发者社区的文档中心               RokidOS开放源代码项目简介 RokidOS是 Rokid领导的基于云端语音服

代理服务器的常用使用方法介绍(图文教程)

大多费尔公用模块都需要连接互联网,但有时可能因为网络问题而无法正常连接,这时可以尝试使用代理服务器。但首先您必需知道代理服务

教您htc恢复出厂设置的使用技巧方法

恢复出厂设置这个功能并不是经常使用的,因为误操作引起的后果是非常严重的。恢复出厂设置从字面上就可以理解,手机中的所有设置将恢

分享到:

栏目导航

推荐阅读

热门阅读