zoukankan      html  css  js  c++  java
  • 关于ComponentName组件名称的使用

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

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

    第二个参数是你要启动的Activity或者Service的全称(包名+类名),代码如下:

    启动一个Activity:

    [java] view plain copy
     
     print?
    1. Intent intent = new Intent();  
    2.             intent.setComponent(new ComponentName("com.example.otherapp",  
    3.                     "com.example.otherapp.MainActivity2"));  
    4.             startActivity(intent);  



    启动一个Service:

    [java] view plain copy
     
     print?
    1. Intent it = new Intent();  
    2. it.setComponent(new ComponentName("com.example.otherapp",  
    3.         "com.example.otherapp.MyService"));  
    4. startService(it);  



    注意

    如果你要的启动的其他应用的Activity不是该应用的入口Activity,那么在清单文件中,该Activity节点一定要加上android:exported="true",表示允许其他应用打开,对于所有的Service,如果想从其他应用打开,也都要加上这个属性:

    [java] view plain copy
     
     print?
    1. <service  
    2.     android:name="com.example.otherapp.MyService"  
    3.     android:exported="true" >  
    4. </service>  
    5.   
    6. <activity  
    7.     android:name="com.example.otherapp.MainActivity2"  
    8.     android:exported="true" >  
    9. </activity>  


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

    那么为什么入口Activity不用添加这个属性就可以被其他应用启动呢?我们来看一段入口Activity的注册代码:

    [java] view plain copy
     
     print?
    1. <activity  
    2.     android:name=".MainActivity"  
    3.     android:label="@string/app_name" >  
    4.     <intent-filter>  
    5.         <action android:name="android.intent.action.MAIN" />  
    6.   
    7.         <category android:name="android.intent.category.LAUNCHER" />  
    8.     </intent-filter>  
    9. </activity>  


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

    明白否?

    有问题欢迎交流...

    http://blog.csdn.net/u012702547/article/details/49557905

    http://blog.csdn.net/huangyabin001/article/details/36626341

  • 相关阅读:
    远程服务器git搭建
    Ubuntu安装配置MySQL数据库,Apache,PHP
    html radio check
    opencv 抠图联通块(c接口)
    Vim命令
    二维码
    zTree Jquery eCharts
    Java进阶篇设计模式之二 ----- 工厂模式
    SpringBoot整合Netty并使用Protobuf进行数据传输(附工程)
    SpringBoot整合Jsp和Thymeleaf (附工程)
  • 原文地址:https://www.cnblogs.com/tianzijiaozi/p/7639990.html
Copyright © 2011-2022 走看看