当前位置:   article > 正文

显示与隐式意图 intent_隐式intent直接指定来源活动与目标活动

隐式intent直接指定来源活动与目标活动

Android官方

https://developer.android.com/codelabs/basic-android-kotlin-training-activities-intents?hl=zh_cn#6

intent组成元素

元素名称设置方法说明与用途
ComponentsetComponent组件,它指定意图的来源与目标
ActionsetAction动作,它指定意图的动作行为
DatasetData即Uri,它指定动作要操纵的数据路径
CategoryaddCategory类别,它指定意图的操作类别
TypesetType数据类型,它指定消息的数据类型
ExtrasputExtras扩展信息,它指定装载的包裹信息
FlagssetFlags标志位,它指定活动的启动标志

显示Intent

直接指定来源活动与目标活动。

  1. intent构造方法传入的是当前package的context以及跳转的对象。
// 1. intent构造函数中直接声明需要跳转的界面
Intent intent = new Intent(this, MainActivity2.class);
startActivity(intent);

public Intent(Context packageContext, Class<?> cls) {
  	mComponent = new ComponentName(packageContext, cls);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. setClass中传递的参数为当前package的context以及跳转的对象。
// 2.调用意图对象的setClass方法指定跳转
Intent intent = new Intent();
intent.setClass(this,MainActivity2.class);
startActivity(intent);

public @NonNull Intent setClass(@NonNull Context packageContext, @NonNull Class<?> cls) {
    mComponent = new ComponentName(packageContext, cls);
    return this;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 调用意图对象的setComponent方法
// 3.调用意图对象的setComponent方法
Intent intent = new Intent();
ComponentName componentName = new ComponentName(this, MainActivity2.class);
intent.setComponent(componentName);
startActivity(intent);
 
public ComponentName(@NonNull Context pkg, @NonNull Class<?> cls) {
   mPackage = pkg.getPackageName();
    mClass = cls.getName();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意:
特殊的componentName构建方法,根据包名和类名构建ComponentName,然后通过intent实现跳转。

Intent intent = new Intent();
ComponentName componentName = new ComponentName(getPackageName(), "cn.jj.permissiontest.MainActivity2");
intent.setComponent(componentName);
startActivity(intent);
  • 1
  • 2
  • 3
  • 4

隐式跳转

在这里插入图片描述

隐式Intent,没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配。
通常App不希望向外部暴露活动名称,只给出一个事先定义好的标记串,这样大家约定俗成、按图索骥就好,隐式Intent便起到了标记过滤作用。

ACTION_MAINandroid.intent.action.MAINApp启动时的入口
  1. 当声明了Action后,就可以根据action进行页面跳转了。
intent.setAction("android.intent.action.Li");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
  • 1
  • 2
  • 3

在intent中声明action为android.intent.action.Li的intent-filter,之后,指定intent的动作为android.intent.action.Li,就可以实现跳转到此界面。

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>
        <action android:name="android.intent.action.Li" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Flags

可以参考这篇文章

FLAG_ACTIVITY_NEW_TASK

假设现在有一个栈1,里面是A,B,C。此时,在C中启动D的时候,设置FLAG_ACTIVITY_NEW_TASK标记,此时会有两种情况:

1.如果D这个ActivityManifest.xml中的声明中添加了Task Affinity,系统首先会查找有没有和DTask Affinity相同的Task栈存在,如果有存在,将D压入那个栈
2.如果D这个ActivityManifest.xml中的Task Affinity默认没有设置,则会把其压入栈1,变成:A B C D,这样就和标准模式效果是一样的了。
  • 1
  • 2

也就是说,设置了这个标志后,新启动的Activity并非就一定在新的Task中创建,如果A和B在属于同一个package,而且都是使用默认的Task Affinity,那B还是会在A的task中被创建。 所以,只有A和B的Task Affinity不同时,设置了这个标志才会使B被创建到新的Task。注意如果试图从非Activity的非正常途径启动一个Activity,比如从一个Receiver中启动一个Activity,则Intent必须要添加FLAG_ACTIVITY_NEW_TASK标记。

FLAG_ACTIVITY_CLEAR_TASK

如果Intent中设置了这个标志,会导致含有待启动Activity的Task在Activity被启动前清空。也就是说,这个Activity会成为一个新的root,并且所有旧的activity都被finish掉。这个标志只能与FLAG_ACTIVITY_NEW_TASK 一起使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/236072
推荐阅读
相关标签
  

闽ICP备14008679号