赞
踩
https://developer.android.com/codelabs/basic-android-kotlin-training-activities-intents?hl=zh_cn#6
元素名称 | 设置方法 | 说明与用途 |
---|---|---|
Component | setComponent | 组件,它指定意图的来源与目标 |
Action | setAction | 动作,它指定意图的动作行为 |
Data | setData | 即Uri,它指定动作要操纵的数据路径 |
Category | addCategory | 类别,它指定意图的操作类别 |
Type | setType | 数据类型,它指定消息的数据类型 |
Extras | putExtras | 扩展信息,它指定装载的包裹信息 |
Flags | setFlags | 标志位,它指定活动的启动标志 |
直接指定来源活动与目标活动。
// 1. intent构造函数中直接声明需要跳转的界面
Intent intent = new Intent(this, MainActivity2.class);
startActivity(intent);
public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
// 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;
}
// 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();
}
注意:
特殊的componentName构建方法,根据包名和类名构建ComponentName,然后通过intent实现跳转。
Intent intent = new Intent();
ComponentName componentName = new ComponentName(getPackageName(), "cn.jj.permissiontest.MainActivity2");
intent.setComponent(componentName);
startActivity(intent);
隐式Intent,没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配。
通常App不希望向外部暴露活动名称,只给出一个事先定义好的标记串,这样大家约定俗成、按图索骥就好,隐式Intent便起到了标记过滤作用。
ACTION_MAIN | android.intent.action.MAIN | App启动时的入口 |
---|
intent.setAction("android.intent.action.Li");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
在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,里面是A,B,C。此时,在C中启动D的时候,设置FLAG_ACTIVITY_NEW_TASK标记,此时会有两种情况:
1.如果D这个Activity在Manifest.xml中的声明中添加了Task Affinity,系统首先会查找有没有和D的Task Affinity相同的Task栈存在,如果有存在,将D压入那个栈
2.如果D这个Activity在Manifest.xml中的Task Affinity默认没有设置,则会把其压入栈1,变成:A B C D,这样就和标准模式效果是一样的了。
也就是说,设置了这个标志后,新启动的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标记。
如果Intent中设置了这个标志,会导致含有待启动Activity的Task在Activity被启动前清空。也就是说,这个Activity会成为一个新的root,并且所有旧的activity都被finish掉。这个标志只能与FLAG_ACTIVITY_NEW_TASK 一起使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。