Android之Intent显示和隐式调用
显式Intent:
- 显式意图明确指定了要激活的组件是哪个组件,一般是在应用程序内部使用。
如:Intent.setComponent()、Intent.setClassName()或Intent.setClass()方法或者在new Intent(A.this,B.class)指明需要转向到的Activity, - 效率高,但耦合度也高
隐式Intent:
- 通过在清单文件中配置IntentFilter来实现的,它一般没有明确指出目标组件名称
- 用于在不同应用程序之间
- 降低程序的耦合度,但效率更低。
- 如果不希望当前隐式intent被跨应用启动,只需要在AndroidManifest.xml对应的activity中配置android:exported="false"即可。
intent就是意图的意思。Intent分两种:显式(Explicit intent)和隐式(Implicit intent)。
一、显式(设置Component)
显式,即直接指定需要打开的activity对应的类。
以下多种方式都是一样的,实际上都是设置Component直接指定Activity类的显式Intent,由MainActivity跳转到SecondActivity:
1、构造方法传入Component,最常用的方式
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
2、setComponent方法
ComponentName componentName = new ComponentName(this, SecondActivity.class);
// 或者ComponentName componentName = new ComponentName(this, "com.example.app016.SecondActivity");
// 或者ComponentName componentName = new ComponentName(this.getPackageName(), "com.example.app016.SecondActivity");
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
3、setClass/setClassName方法
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
// 或者intent.setClassName(this, "com.example.app016.SecondActivity");
// 或者intent.setClassName(this.getPackageName(), "com.example.app016.SecondActivity");
startActivity(intent);
显式Intent通过Component可以直接设置需要调用的Activity类,可以唯一确定一个Activity,意图特别明确,所以是显式的。设置这个类的方式可以是Class对象(如SecondActivity.class),也可以是包名加类名的字符串(如"com.example.app016.SecondActivity")。这个很好理解,在应用程序内部跳转界面常用这种方式。
二、隐式
隐式,即不是像显式的那样直接指定需要调用的Activity,隐式不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的
下面以Action为例:AndroidManifest.xml文件中,首先被调用的Activity要有一个带有
android:name="com.example.app016.SecondActivity">
然后,在MainActivity,才可以通过这个action name找到上面的Activity。下面两种方式分别通过setAction和构造方法方法设置Action,两种方式效果相同。
1、setAction方法
Intent intent = new Intent();
intent.setAction("abcdefg");
startActivity(intent);
2、构造方法直接设置Action
Intent intent = new Intent("abcdefg");
startActivity(intent);
通过设置Action字符串,表明自己的意图,即我想干嘛,需要由系统解析,找到能够处理这个Intent的Activity并启动。比如我想打电话,则可以设置Action为"android.intent.action.DIAL"字符串,表示打电话的意图,系统会找到能处理这个意图的Activity,例如调出拨号面板。
有几点需要注意:
1、这个Activity其他应用程序也可以调用,只要使用这个Action字符串。这样应用程序之间交互就很容易了,因为如此,为了防止应用程序之间互相影响,一般命名方式是包名+Action名,例如这里命名"abcdefg"就很不合理了,就应该改成"com.example.app016.MyTest"。
2、可以在自己的程序中调用其他程序的Action。例如可以在自己的应用程序中调用拨号面板:
Intent intent = new Intent(Intent.ACTION_DIAL);
// 或者Intent intent = new Intent("android.intent.action.DIAL");
// Intent.ACTION_DIAL是内置常量,值为"android.intent.action.DIAL"
startActivity(intent);
3、一个Activity可以处理多种Action
只要你的应用程序够牛逼,一个Activity可以看网页,打电话,发短信,发邮件。。。当然可以。
Intent的Action只要是其中之一,就可以打开这个Activity。
android:name="com.example.app016.SecondActivity">
示例参考:https://blog.csdn.net/xiao__gui/article/details/11392987
更多相关文章
- android自动加载模块.ko文件的小方法
- android 两指缩放图片 event.getActionMasked() 方法的使用
- Android的图形API调用(一)
- TabLayout属性详解
- Android中view绘制常用知识
- Android(安卓)使用MotionLayout实现动画效果
- Android实现一个通用的PopupWindow
- Android(安卓)Provider用法
- 在Android应用中定制菜单