zoukankan      html  css  js  c++  java
  • ComponentName

    ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。

    实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称:

    /

    第二个参数是你要启动的Activity或者Service的全称(包名+类名),代码如下:
    启动一个Activity:
    Intent intent = new Intent();
                intent.setComponent(new ComponentName(com.example.otherapp,
                com.example.otherapp.MainActivity2));
                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,如果想从其他应用打开,也都要加上这个属性:
    对于除了入口Activity之外的其他组件,如果不加这个属性,都会抛出“java.lang.SecurityException: Permission Denial.....”异常
    那么为什么入口Activity不用添加这个属性就可以被其他应用启动呢?我们来看一段入口Activity的注册代码:
    入口Activity和普通Activity唯一不同的地方就是入口Activity多了一个过滤器,对于包含了过滤器的组件,意味着该组件可以提供给外部的其他应用来使用,它的exported属性默认为true,相反,如果一个组件不包含任何过滤器,那么意味着该组件只能通过指定明确的类名来调用,也就是说该组件只能在应用程序的内部使用,在这种情况下,exported属性的默认值是false。 
    Intent advIntent = new Intent();
                ComponentName advIn = new ComponentName(ctx,"kds.szkingdom.commons.android.tougu.TouguShowH5Activity");
                advIntent.setComponent(advIn);
                Bundle bundle = new Bundle();
                bundle.putString("key_h5url", advLink2);
                advIntent.putExtras(bundle);
                ctx.startActivity(advIntent);
  • 相关阅读:
    bash :startx command not found
    RHSA-2019:1880-低危: curl 安全和BUG修复更新 及 RHSA-2019:1884-中危: libssh2
    CentOS8 安装后 无法切换中文输入法
    【centOS7】centOS7上普通用户切换root用户,相互切换
    centos8安装图解(超详细教程)
    电导率与土壤盐浓度间的计算公式
    Tlink物联网平台使用(三)
    Wireshark查看https的通讯
    docker中建立私有git服务器[gitlab]
    【转】程序员的生产力始于需求而非工具
  • 原文地址:https://www.cnblogs.com/yaowen/p/5470312.html
Copyright © 2011-2022 走看看