ComponentName的应用
2016-01-25 16:12
489 查看
ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。
实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称:
第二个参数是你要启动的Activity或者Service的全称(包名+类名),代码如下:
启动一个Activity:
注意
如果你要的启动的其他应用的Activity不是该应用的入口Activity,那么在清单文件中,该Activity节点一定要加上android:exported=true,表示允许其他应用打开,对于所有的Service,如果想从其他应用打开,也都要加上这个属性:
对于除了入口Activity之外的其他组件,如果不加这个属性,都会抛出“java.lang.SecurityException: Permission Denial…..”异常
那么为什么入口Activity不用添加这个属性就可以被其他应用启动呢?我们来看一段入口Activity的注册代码:
入口Activity和普通Activity唯一不同的地方就是入口Activity多了一个过滤器,对于包含了过滤器的组件,意味着该组件可以提供给外部的其他应用来使用,它的exported属性默认为true,相反,如果一个组件不包含任何过滤器,那么意味着该组件只能通过指定明确的类名来调用,也就是说该组件只能在应用程序的内部使用,在这种情况下,exported属性的默认值是false。
实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称:
第二个参数是你要启动的Activity或者Service的全称(包名+类名),代码如下:
启动一个Activity:
[code]package com.example.day06_intent; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button button1; private Button button2; private Button button3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1= (Button) findViewById(R.id.button1); button2= (Button) findViewById(R.id.button2); button3= (Button) findViewById(R.id.button3); button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent =new Intent(); switch (v.getId()) { //ComponentName //1.通过ComponentName 跳转页面(Intent的简版) case R.id.button1: ComponentName componentName1 =new ComponentName(MainActivity.this, NextActivity.class); intent.setComponent(componentName1); startActivity(intent); break; //2.跳转到另外一个app(此时另外一个app需要先启动) //实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称: // 第二个参数是你要启动的Activity或者Service的全称(包名+类名) case R.id.button2: ComponentName componentName2 =new ComponentName("com.example.day05_activity", "com.example.day05_activity.MainActivity"); intent.setComponent(componentName2); startActivity(intent); break; //3.隐式跳转 case R.id.button3: intent.setAction("next"); startActivity(intent); break; default: break; } } }
注意
如果你要的启动的其他应用的Activity不是该应用的入口Activity,那么在清单文件中,该Activity节点一定要加上android:exported=true,表示允许其他应用打开,对于所有的Service,如果想从其他应用打开,也都要加上这个属性:
对于除了入口Activity之外的其他组件,如果不加这个属性,都会抛出“java.lang.SecurityException: Permission Denial…..”异常
那么为什么入口Activity不用添加这个属性就可以被其他应用启动呢?我们来看一段入口Activity的注册代码:
入口Activity和普通Activity唯一不同的地方就是入口Activity多了一个过滤器,对于包含了过滤器的组件,意味着该组件可以提供给外部的其他应用来使用,它的exported属性默认为true,相反,如果一个组件不包含任何过滤器,那么意味着该组件只能通过指定明确的类名来调用,也就是说该组件只能在应用程序的内部使用,在这种情况下,exported属性的默认值是false。
相关文章推荐
- UrlRewrite的简单实用
- Hive配置与操作实践
- mysql中的unix_timestamp函数
- 关卡数分数代码
- vs2012窗口布局恢复
- 缓存
- 横向滑动ViewPager和Fragment
- vs各类文件的作用
- 【箭扣观点】解剖ISIS的社交能力
- TabLayout和ViewPager实现Tabs切换
- Json格式字符串转换为数组
- Centos 7 PHP7环境配置 LNMP
- 设计模式--10、工厂方法和抽象工厂模式
- Protocol Buffer技术详解(语言规范)
- 使用pageheap调试程序,监控内存
- C++编程中指针的声明与基本使用讲解
- artemplate的自动保存问题
- hbase的thrift接口
- Hadoop 与 Spark 和 HBase 常用配置参数总结
- mybatis使用oracle序列