当前位置:   article > 正文

Android显式意图和隐式意图_android 隐式意图

android 隐式意图

intent基本理解

  • 我们都知道Android四大组件:Activity 、Service、broadcast receiver 及 内容提供者。
  • 其中,Activity 、Service、broadcast receiver 三大组件之间的通信 intent 起着至关重要的作用,即 媒介。
  • intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)

显式意图 和 隐式意图

显示意图:在创建 intent 的时候明确指定了组件名,例如:调用 Intent.setComponent() 或Intent.setClass() 或 使用构造器来指定组件( new Intent(MainActivity.this, OtherActivity.class)

隐式意图:在创建 intent 的时候没有明确指定组件名,而是 系统根据 设置的 动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图。

隐式意图代码示例

第一步:创建 SecondActivity 

  1. package com.wust.intenttest;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.TextView;
  5. import androidx.annotation.Nullable;
  6. /**
  7. * ClassName: SecondActivity <br/>
  8. * Description: <br/>
  9. * date: 2021/10/24 22:49<br/>
  10. *
  11. * @author yiqi<br />
  12. * @QQ 1820762465
  13. * @微信 yiqiideallife
  14. * @技术交流QQ群 928023749
  15. */
  16. public class SecondActivity extends Activity {
  17. @Override
  18. protected void onCreate(@Nullable Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. TextView textView = new TextView(this);
  21. textView.setText("我是secondView");
  22. setContentView(textView);
  23. }
  24. }

第二步:在 清单文件 中声明

  1. <activity android:name=".SecondActivity">
  2. <intent-filter>
  3. <!-- 自定义的动作 一般前缀为包名-->
  4. <action android:name="com.wust.intenttest.SECOND"/>
  5. <!-- 附加信息 这个必须得加上-->
  6. <category android:name="android.intent.category.DEFAULT"/>
  7. </intent-filter>
  8. </activity>

如果你在清单文件中 没有加 <category android:name="android.intent.category.DEFAULT"/> ,就会报如下错误,这是因为 你在调用 startActivity()的时候系统自动给你的意图添加了 android:name="android.intent.category.DEFAULT" 这个类别,所以你在清单文件中不声明,系统当然自动匹配不上,除非你不用隐式意图。

第三步:跳转代码

  1. public void tz(View v) {
  2. //这里我们使用隐式意图 所以不指明是哪个组件
  3. Intent intent = new Intent();
  4. intent.setAction("com.wust.intenttest.SECOND");
  5. // 这个类别系统会自动添加
  6. intent.addCategory(Intent.CATEGORY_DEFAULT);
  7. startActivity(intent);
  8. }

第四步:传递 Uri 数据

我们可以通过Intent的Data、Type、Extra传入一些数据,这些数据可以用于进一步筛选匹配Activity,打开指定的页面、文件,或者给准备启动的Activity传入需要的参数。

这个时候我们再新建一个 ThirdActivity.java 

  1. package com.wust.intenttest;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.TextView;
  5. import androidx.annotation.Nullable;
  6. /**
  7. * ClassName: ThirdActivity <br/>
  8. * Description: <br/>
  9. * date: 2021/10/25 9:57<br/>
  10. *
  11. * @author yiqi<br />
  12. * @QQ 1820762465
  13. * @微信 yiqiideallife
  14. * @技术交流QQ群 928023749
  15. */
  16. public class ThirdActivity extends Activity {
  17. @Override
  18. protected void onCreate(@Nullable Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. TextView textView = new TextView(this);
  21. textView.setText("我是ThirdView");
  22. setContentView(textView);
  23. }
  24. }

同时在 清单文件 中进行声明

  1. <activity android:name=".SecondActivity">
  2. <intent-filter>
  3. <!-- 自定义的动作 一般前缀为包名-->
  4. <action android:name="com.wust.intenttest.SECOND" />
  5. <!-- 附加信息 这个必须得加上-->
  6. <category android:name="android.intent.category.DEFAULT" />
  7. </intent-filter>
  8. </activity>
  9. <activity android:name=".ThirdActivity">
  10. <intent-filter>
  11. <!-- 自定义的动作 一般前缀为包名-->
  12. <action android:name="com.wust.intenttest.SECOND" />
  13. <!-- 附加信息 这个必须得加上-->
  14. <category android:name="android.intent.category.DEFAULT" />
  15. </intent-filter>
  16. </activity>

我们可以发现 我们注册 SecondActivity 和 ThirdActivity 的时候 给的筛选条件 action 、category 是一样的。所以但我们仍然执行第三步的跳转代码时,系统就会让我们进行选择了,运行效果如下图:

这个时候,我们的 data 筛选条件就起作用了,我们不妨在  ThirdActivity 声明的时候加上如下筛选条件:

  1. <activity android:name=".ThirdActivity">
  2. <intent-filter>
  3. <!-- 自定义的动作 一般前缀为包名-->
  4. <action android:name="com.wust.intenttest.SECOND" />
  5. <!-- 附加信息 这个必须得加上-->
  6. <category android:name="android.intent.category.DEFAULT" />
  7. <!-- 自定义的scheme,还有别的属性,自行尝试 -->
  8. <data android:scheme="http"/>
  9. </intent-filter>
  10. </activity>

这个时候,我们再 执行第三步的跳转代码 毫无疑问,当然是跳转到 SecondActivity。效果如下:

但是,这个效果并不是我要说的重点,我们重点是看如何通过 data 来传递 uri 数据。 所以,我们对 第三步 的跳转代码进行如下改造:

  1. public void tz(View v) {
  2. // 这里我们使用隐式意图 所以不指明是哪个组件
  3. Intent intent = new Intent();
  4. intent.setAction("com.wust.intenttest.SECOND");
  5. // 这个类别系统会自动添加
  6. intent.addCategory(Intent.CATEGORY_DEFAULT);
  7. // 设置数据
  8. intent.setData(Uri.parse("http://121.0.0.1"));
  9. startActivity(intent);
  10. }

相应的  ThirdActivity 也得作出相应的接收

  1. package com.wust.intenttest;
  2. import android.app.Activity;
  3. import android.net.Uri;
  4. import android.os.Bundle;
  5. import android.widget.TextView;
  6. import androidx.annotation.Nullable;
  7. /**
  8. * ClassName: ThirdActivity <br/>
  9. * Description: <br/>
  10. * date: 2021/10/25 9:57<br/>
  11. *
  12. * @author yiqi<br />
  13. * @QQ 1820762465
  14. * @微信 yiqiideallife
  15. * @技术交流QQ群 928023749
  16. */
  17. public class ThirdActivity extends Activity {
  18. @Override
  19. protected void onCreate(@Nullable Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. TextView textView = new TextView(this);
  22. textView.setText("我是ThirdView");
  23. setContentView(textView);
  24. Uri data = getIntent().getData();
  25. System.out.println( "data.getHost() => " + data.getHost());
  26. System.out.println( "data.getScheme() => " + data.getScheme());
  27. }
  28. }

运行效果如下:

所有对于 data 这个筛选项 我们搞清楚以下三个地方:

清单文件中

<data android:scheme="http" android:host="127.0.0.1" android:port="80" android:path="/mypath" android:mimeType="wust/yiqi"/>

跳转代码

intent.setDataAndType(Uri.parse("http://127.0.0.1:80/mypath"), "wust/yiqi");

获取数据代码

data.getScheme()://data.getHost():data.getPort()data.getPath()

显式意图

如果大家把上面的 隐式意图 搞清楚,显式意图简直就是小草一碟。

根据 显式意图 的定义,我们在创建 intent 的时候,明确那个要跳转的组件即可。

第一步:代码示例

  1. public void tz(View v) {
  2. // 这里我们使用显式意图 所以指明是哪个组件
  3. Intent intent = new Intent(this,SecondActivity.class);
  4. startActivity(intent);
  5. }

第二步:传递 action 、category、data,请参考隐式意图

跳转代码

  1. public void tz(View v) {
  2. // 这里我们使用显式意图 所以指明是哪个组件
  3. Intent intent = new Intent(this,SecondActivity.class);
  4. intent.setAction("com.wust.intenttest.SECOND");
  5. // 这个类别系统会自动添加
  6. intent.addCategory(Intent.CATEGORY_DEFAULT);
  7. // 设置数据
  8. intent.setDataAndType(Uri.parse("http://127.0.0.1:80/mypath"), "wust/yiqi");
  9. startActivity(intent);
  10. }

数据获取代码 在目标组件中编写,这里的目标组件为 SecondActivity

  1. Uri data = getIntent().getData();
  2. System.out.println("data.getHost() => " + data.getPath());
  3. System.out.println("data.getScheme() => " + data.getScheme());

效果展示

 

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

闽ICP备14008679号