Android | Intent

Android Intent

Android 应用程序内不同组件之间的通信载体。
Intent 封装了当前组件需要启动或触发的目标组件的信息。

**优点1:**提供一致的编程模型封装“启动意图”,无论是对 ActivityServiceBroadcastReceiver来说都一致。
**优点2:**利于高层次解耦,在程序只想启动具有某种特征的组件,不想和某个具体的组件耦合时可以使用 Intent

包含如下属性:

  • Component:明确指定需要启动的目标组件。
  • Action:该 Intent 所要完成的一个 抽象动作
  • Category:为 Action 增加额外的附加类别信息。
  • Data:向 Action 提供操作的数据。
  • Type:指定 Data 属性所指定的 Uri 对应的 MIME 类型。
  • Extra:携带需要交换的数据,在多个 Action 之间进行数据交换,属性值是一个 Bundle 对象(类似 Map 对象)。
  • Flag:用于未该 Intent 添加一些额外的控制旗标。

使用 Intent 启动不同组件方法

组件类型启动方法
ActivitystartActivity(Intent intent)
ActivitystartActivityForResule(Intent intent, int requestCode)
ServiceComponentName startService(Intent service)
Serviceboolean bindService(Intent service, ServiceConnection conn, int flags)
BroadcastReceiversendBroadcast(Intent intent)
BroadcastReceiversendBroadcast(Intent intent, String receiverPermission)
BroadcastReceiversendOrderBroadcast(Intent intent, String receiverPermission)
BroadcastReceiversendOrderBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
BroadcastReceiversendStickyBroadcast(Intent intent)
BroadcastReceiversendStickyOrderedBroadcast9Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

页面跳转及传参

利用 Intent

// Activiy1 
String string1 = "...";
String string2 = "...";

Intent intent = new Intent(Activity1.this, Activity2.class);
// 上述语句是下面语句的简写形式:
// ComponentName comp = new ComponentName(Activity1.this, Activity2.class);
// Intent intent = new Intent();
// intent.setComponent(comp);
intent.putExtra("param1", string1);
intent.putExtra("param2", string2);
startActivity(intent);

// Activity2
Intent intent = getIntent();
String param1 = intent.getExtra("param1");
String param2 = intent.getExtra("param2");

利用 Bundle

// Activity1
String string1 = "...";
String string2 = "...";
Intent intent = new Intent(Activity1.this, Activity2.class);
BUndle bundle = new Bundle();
bundle.putString("param1", string1);
bundle.putStirng("param2", string2);
intent.putExtras(bundle);
startActivity(intent);

// Activity2
Bundle bundle = this.getIntent().getExtras();
String param1 = bundle.getString("param1");
String param2 = bundle.getStirng("param2");

Component

需接受一个 ComponentName 对象,而创建此对象需要指定包名与类名,这样才可以唯一确定一组件类。这样应用程序可以根据给定的组件类去启动特定的组件。
指定 Component 属性的 Intent 被称为 显式Intent ;没有指定 Component 属性的 Intent 被称为 隐式Intent ,没有明确启动的组件,需要根据制定规则去启动符合的组件。

Action Category<intent-filter> 配置

Intent 通过指定 Action 属性值(某一字符串),可以把该 Intent 与具体 Activity 分离,提供高层次解耦。

每个 Intent 只能指定一个 Action,但可以指定多个 CategoryIntentFilter 用于声明该组件能满足的要求,每个组件可以声明自己满足多个 ActionCategory。只要某个组件能满足的要求大于等于 Intent 所指定的要求,那么该 Intent 就可以启动该组件。

Intent 对象可以通过 Android 内部提供的标准的 ActionCategory 常量启动 Android 系统的其他停用的程序组件,包括系统自带的程序组件(需要权限允许)。

<intent-filter.../> 中可包含如下子元素:

  • 0~N个 <action.../> 子元素
  • 0~N个 <category.../> 子元素
  • 0~1个 <data.../> 子元素
<activity android:name=".SecondActivity"
		android:label="Second-Activity"/>
	<intent-filter>
		<!-- 该Activity能响应Action属性值为指定字符串的Intent -->
		<action android:name="..."/>
		<action android:name="..."/>
		<!-- 当创建Intent时,该Intent默认添加一个值为Intent.CATEGORY_DEFAULT的Category属性值 -->
		<category android:name="android.intent.category.DEFAULT"/>
	</intent-filter>
</activity>

// 设置Action属性
publiv static final String SECOND_ACTION = "SECOND_ACTION";
intent.setAction(SecondActivity.SECOND_ACTION);

// 添加Category属性
intent.addCategory("SECOND_CATEGORY");

// 在程序中通过如下代码查看该Activity对应的Intent的Action属性值与Category属性值:
Sting action = getIntent().getAction();
Set<String> Category = getInstent().getCategories();

// 调起系统应用-联系人
intent.setAction(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT);

// 返回系统桌面
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);

Data Type<intent-filter> 配置

Date属性接受一个Uri对象,通常通过如下形式字符串表示:

// 格式
scheme://host:port/path

// 示例
content://com.android.contacts/contacts/1
tel:123

Type 属性用于指定 Data 属性所指定 Uri 对应的 MIME 类型,这种 MIME 类型可以是任何自定义的 MIME 类型,只要符合 abc/xyz 格式的字符串即可。

Data 属性会与 Type 属性相互覆盖:

  • 先设置Data属性,后设置Type属性,Type属性将覆盖Data属性;
  • 先设置Type属性,后设置Data属性,Data属性将覆盖Type属性;
  • 调用 setDataAndType() 方法,同时设置Data属性与Type属性。
// 设置Type属性
intent.setType("abc/xyz");

// 设置Data属性
intent.setData(Uri.parse("scheme://host:port/path"));

// 同时设置Data与Type属性
intent.setDataAndType(Uri.parse("scheme://host:port/path"), "abc/xcy");

AndroidManifest.xml 文件中为组件声明 DataType 属性都通过 <data.../> 元素:

<data android:mimeType=""
	android:scheme=""
	android:host=""
	android:port=""
	android:path=""
	android:pathPrefis=""
	android:pathPattern="" />

其中:

  • mimeType:用于声明该组件所能匹配的Intent的 Type 属性;
  • scheme:用于声明该组件所能匹配的Intent的Data属性的 scheme 部分;
  • host:用于声明该组件所能匹配的Intent的Data属性的 host 部分;
  • port:用于声明该组件所能匹配的Intent的Data属性的 port 部分;
  • path:用于声明该组件所能匹配的Intent的Data属性的 path 部分;
  • pathPrefix:用于声明该组件所能匹配的Intent的Data属性的 path 前缀;
  • pathPattern:用于声明该组件所能匹配的Intent的Data属性的 path 字符串模板。

匹配时Intent的Type属性需要与 <intent-filter><data.../> 的mimeType属性相同。

匹配时Intent的Data属性,不一定需要完全满足,只要Intent中Data属性的Uri与 <intent-filter><data.../> 属性匹配下述中任何一种,即可打开该组件:

  • scheme
  • scheme、host
  • scheme、host、port
  • scheme、host、path
  • shceme、host、port、path

Flag属性

用于为该Intent添加一些额外的控制旗标,调用 addFlags() 方法添加控制旗标。一些常用的Flag属性如下:

属性作用
FLAG_ACTIVITY_BROUGHT_TO_FRONT如果通过该Flag启动的Activity已经存在,下次再次启动时,将只是将该Activity带到前台。例如现在Activity栈中有Activity A,此时以该Flag启动Activity B(即Activity B是以FLAG_ACTIVITY_BROUGHT_TO_FRONT旗标启动的),然后在Activity B中启动C、D,这时Activity栈中的情形是A、B、C、D。如果此时在Activity D中再启动B,将直接把Activity栈中的Activity B带到前台。此时Activity栈中的情形是A、C、D、B。
FLAG_ACTIVITY_CLEAR_TOP该Flag相当于加载模式中的singleTask,通过这种Flag启动的Activity将会把要启动的Activity之上的Activity全部弹出Activity栈。例如,Activity栈中包含A、B、C、D这四个Activity,如果采用该Flag从Activity D跳转到Activity B,此时Activity栈中只包含A、B两个Activity。
FLAG_ACTIVITY_NEW_TASK默认的启动旗标。该旗标控制重新创建一个新的Activity。
FLAG_ACTIVITY_NO_ANIMATION该旗标会控制启动Activity时不适用过渡动画。
FLAG_ACTIVITY_NO_HISTORY该旗标控制被启动的Activity将不会保留在Activity栈中。例如Activity中原有A、B、C三个Activity,此时在Activity C中以该Flag启动Activity D,Activity D再启动Activity E,此时Activity栈中只有A、B、C、E这4个Activity,Activity D不会保留在Activity栈中。
FLAG_ACTIVITY_REORDER_TO_FRONT该Flag控制如果当前已有该Activity,直接将该Activity带到前台。例如现在Activity栈中有A、B、C、D这4个Activity,如果使用该Flag来启动Activity B,那么启动后的Activity栈中情形为A、C、D、B。
FLAG_ACTIVITY_SINGLE_TOP该Flag相当于加载模式中的singleTop模式,例如原来Activity栈中有A、B、C、D这四个Activity,在Activity D中再次启动Activity D,那么Activity栈中还是A、B、C、D这四个Activity。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android 重启 Intent 是一个 Intent 对象,当应用程序需要重新启动时可用。在 AndroidManifest.xml 中定义重启 intent 的方式是使用 `android:action` 属性设置为 "android.intent.action.MAIN",`android:category` 属性设置为 "android.intent.category.LAUNCHER"。例如: ``` <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> ``` 这样就可以在桌面上显示应用程序图标,用户可以单击该图标来重新启动应用程序. 可以通过 Intent.FLAG_ACTIVITY_NEW_TASK 或 Intent.FLAG_ACTIVITY_CLEAR_TOP 启动重启Intent 。例如: ``` Intent intent = new Intent(context, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); context.startActivity(intent); ``` 需要注意的是, 每次启动重启Intent, 系统都会清理先前的Task 重新启动一个新的Task。 ### 回答2: 在Android中,我们可以使用Intent来重启应用程序或启动另一个Activity。要重启应用程序,我们可以创建一个新的Intent,将当前的Activity作为目标,并在启动它时添加一些标志。首先,我们需要获取当前的Activity。可以使用getApplicationContext().getPackageManager().getLaunchIntentForPackage(getApplicationContext().getPackageName())方法获取一个启动当前应用程序的Intent。然后,我们可以使用addFlags()方法将FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK标志添加到Intent中。FLAG_ACTIVITY_CLEAR_TOP将清除堆栈中当前Activity之上的所有Activity,而FLAG_ACTIVITY_NEW_TASK将创建一个新的任务栈。最后,我们可以调用startActivity()方法来启动新的Intent,从而重启应用程序。 如果我们要启动另一个Activity,我们需要创建一个新的Intent,并将目标Activity的类名作为参数传递给Intent的构造函数。然后,我们可以调用startActivity()方法来启动这个Intent,从而打开新的Activity。在Activity之间进行切换时,我们可以使用putExtra()方法传递一些附加数据。 总而言之,通过使用Intent,我们可以在Android中实现应用程序重启或启动其他Activity的操作。这些都是在开发Android应用程序时非常常见和有用的功能。 ### 回答3: 在Android中,我们可以通过Intent来实现重启应用程序的功能。重启Intent主要涉及两个方面:启动新的Activity和销毁当前Activity。 1. 启动新的Activity: 要重启应用程序,我们首先需要启动一个新的Activity。我们可以通过创建一个新的Intent对象,并在其中指定要启动的Activity的类名来实现。例如,假设我们的应用程序的主Activity为MainActivity,我们可以使用以下代码启动它: Intent intent = new Intent(context, MainActivity.class); context.startActivity(intent); 2. 销毁当前Activity: 在启动新的Activity之前,我们应该确保销毁当前的Activity。这可以通过调用当前Activity的finish()方法来实现。例如,在我们要重启应用程序的Activity中,我们可以在启动新的Activity之前添加以下代码: finish(); 注意:如果我们希望在启动新的Activity之后,不再返回到之前的Activity,我们可以在启动新的Activity时,设置Intent的标志位FLAG_ACTIVITY_CLEAR_TOP。例如: intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 总结: 要重启应用程序,我们可以通过启动新的Activity和销毁当前的Activity来实现。我们可以使用Intent来启动新的Activity,并使用finish()方法来销毁当前的Activity。如果不希望返回到之前的Activity,可以设置Intent的标志位FLAG_ACTIVITY_CLEAR_TOP。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值