显式Intent与隐式Intent

举报
yd_221104950 发表于 2020/12/03 01:27:18 2020/12/03
【摘要】 1、显式Intent(explicit intent) 显式Intent明确指定了要启动的activity: Intent intent= new Intent(this, Target.class) 1 2、隐式Intent(implicit intent) 隐式Intent没有明确指定要启动的activity ,而是通过设置一些Intent Filter...

1、显式Intent(explicit intent)

显式Intent明确指定了要启动的activity:

  Intent intent= new Intent(this, Target.class)

  
 
  • 1

2、隐式Intent(implicit intent)

隐式Intent没有明确指定要启动的activity ,而是通过设置一些Intent Filter来让系统去筛选合适的activity来启动。Intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data:
在startActivity()时,android会默认加上一个CATEGORY_DEFAULT,这样一来如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配就会失败,你的程序一定会崩溃!所以,如果你的activity支持接收隐式Intent的话就一定要在intent filter中加入以下这个category:

<category android:name="android.intent.category.DEFAULT"/>

  
 
  • 1

如果组件不声明intent-filter,那么所有的隐式Intent事件都不会发送给该组件。

3、data由URI来描述和定位,URI由三部分组成,

scheme://host:port/path 模式://主机:端口/路径

  
 
  • 1
<data android:mimeType=""
android:scheme=""
android:host=""
android:port=""
android:path=""
android:pathPrefix=""
android:pathPattern=""/>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上面<data…/>元素支持如下属性:

mimeType:用于声明该组件所能匹配的Intent的Type属性。
scheme:用于声明该组件所能匹配的Intent的Data属性的scheme部分。
host:用于声明该组件所能匹配的Intent的Data属性的host部分。
port:用于声明该组件所能匹配的Intent的Data属性的port部分。
path:用于声明该组件所能匹配的Intentde Data属性的path部分。
pathPrefix:用于声明该组件所能匹配的Intent的Data属性的path前缀。
pathPattern:用于声明该组件所能匹配的Intent的的Data属性的path字符串模板。
Intent的Type属性也用于指定该Intent的要求,必须对应组件中<intent-filter…/>元素中<data…/>子元素的mineType属性与此相同,才能启动该组件。

例子:

如果我们的manifest.xml是这样的:

<manifest>
... <application> ... <activity android:name=".LoginActivity" android:label="@string/title_activity_login"> <intent-filter> <action android:name="com.wong.mytesta.W" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="com.wong.www" android:mimeType="text/haha" android:path="/mytest" android:port="1000" android:scheme="wong"/> </intent-filter> </activity> <activity android:name=".NavigationActivity" android:label="@string/title_activity_navigation" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="com.wong.mytesta.WWW" /> <category android:name="com.wong.MyCategory" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".TabActivity" android:label="@string/title_activity_tab" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="com.wong.mytesta.WWW" /> <category android:name="com.wong.MyCategory" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".SettingsActivity" android:label="@string/title_activity_settings"> <intent-filter> <action android:name="com.wong.mytesta.WWWB" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> ... </application>

</manifest>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

我们用隐式来启动SettingsActivity:

Intent intent = new Intent();
intent.setAction("com.wong.mytesta.WWWB");
startActivity(intent);

  
 
  • 1
  • 2
  • 3

如果我们用com.wong.mytesta.WWW启动activity,就会弹出两个activity让我们选择,因为根据intent filter的匹配规则,有两个activity符合,即TabActivity和NavigationActivity:

Intent intent = new Intent();
intent.setAction("com.wong.mytesta.WWW");
startActivity(intent);

  
 
  • 1
  • 2
  • 3

使用data来启动activity:

Intent intent = new Intent();
intent.setDataAndType(Uri.parse("wong://com.wong.www:1000/mytest"),"text/haha");
startActivity(intent);

  
 
  • 1
  • 2
  • 3

例外情况:

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

  
 
  • 1
  • 2
  • 3
  • 4

以上的intent filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题。

参考代码

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/88736422

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。