Intent分为两大类:

(1)显性的(Explicit)

(2)隐性的(Implicit)

对于隐性意图,在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent可以方便的达到这种高层次解耦的目的.(在模块间的组件启动

intent定位事件的目的地:

(1)种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。

(2)类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。

(3)组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。

(4)附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。

对于显性Intent:

//ComponentName comp = new ComponentName(FirstActivity.this, SecondActivity.class);

 // 明确的指定了待启动的组件类, 此时的Intent属于显式intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

对于隐性Intent,分几步:

(1) 在清单文件中的application节点下的activity下添加intent-fileter,添加的结构:

1、 设置action

<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.student.query.number" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="studentNumber" />
</intent-filter>
</activity>

通过指定action 来设置传参启动Activity:

1 // action
2 private final String studentQueryIntent = "com.student.query.number";
3 // data
4 Uri studentNumberUri = Uri.parse("student:12");
5 Intent intent = new Intent();
6 intent.setAction(studentQueryIntent);
7 intent.setData(studentNumberUri);
8 startActivity(intent);

2、

<activity  android:name=".OtherActivity">
<intent-filter >
<action android:name="com.sample.student.other"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="student"
       android:host="www.student.com"
       android:port="8080"/>
<data android:scheme="other"/>
<data android:mimeType="text/*" />
</intent-filter>
</activity>

通过设置 URL 来启动相关

1 Intent intent = new Intent();
2 Uri data = Uri.parse("student://www.student.com:8080");
3 intent.setData(data);
4 intent.setDataAndType(data, "text/*");
5 startActivity(intent);

3、关于设置具体URL path:

 1 <activity
2 android:name=".ui.user.LoginActivity"
3 android:screenOrientation="portrait"
4 android:theme="@style/AppTheme">
5 <intent-filter>
6 <action android:name="android.intent.action.VIEW"/>
7
8 <category android:name="android.intent.category.DEFAULT"/>
9 <category android:name="android.intent.category.BROWSABLE"/>
10
11 <!-- login -->
12 <data
13 android:host="www.testapp.com"
14 android:path="/user/login"
15 android:scheme="test"/>
16 </intent-filter>
17 </activity>

写启动方法的时候:

1 Uri uri = Uri.parse("test://www.testapp.com/user/login?userId=" + mUserId);
2
3 startActivity(new Intent(Intent.ACTION_VIEW, uri));

而被启动的Activity接收传参时:

1 String userId = getIntent().getData().getQueryParameter("userId");

getQueryParameter 只返回String 类型,所以要转换下类型。

注意:setData方法使用

 //注:setData、setDataAndType、setType 这三种方法只能单独使用,不可共用。
//要么单独以 setData 方法设置 URI
intent.setData(uri);
//如何在<data>中多了一个android:mimeType="text/*", 此时不能使用intent.setData, 而要使用intent.setDataAndType();
intent.setDataAndType(uri, "text/plain");
//要么单独以 setDataAndType 方法设置 Type
intent.setType("text/plain");

设置了多个data,只要匹配一个就可以启动这个activity。

如果设置了

 <data android:scheme="student"
  android:host="www.student.com"
  android:path="/studentNum"
  android:port="8080"/>

必须完全匹配才能启动:

 Uri data = Uri.parse("student://www.student.com:8080/studentNum");

如果设置了:

 <data android:scheme="student" android:host="www.student.com"/>

那么以下URI都可以匹配:

 Uri data = Uri.parse("student://www.student.com:80");
Uri data = Uri.parse("student://www.student.com:8800");
Uri data = Uri.parse("student://www.student.com");

如果只设置了:

 <data android:scheme="student"/>

那么 以下URI 就可以匹配,后面也可以加其他参数:

 Uri data = Uri.parse("test://");

如果设置了mimeType,那么必须使用 intent.setDataAndType(data, "text/*"); 启动activity。

对于<intent-filter>中的action项可以有多个只要匹配其中一个就可以了。

隐性Intent:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

Android Intent (可通过URL启动 Activity)的更多相关文章

  1. 安卓入门 使用android创建一个项目 从启动activity中响应按钮事件 启动另一个activity 并传递参数

    启动android studio创建一个新项目 public void sendMessage(View view){ Intent intent=new Intent(this,DispalyMes ...

  2. 【Android framework】am命令启动Activity流程

    源码基于Android 4.4.   am start -W -n com.dfp.test/.TEstActivity -W:等目标Activity启动后才返回 -n:用于设置Intent的Comp ...

  3. [android]Intent跳转新的Activity可以传递数据过去

    两种方式: 一,直接通过Bundle对象来传递: 如果我们想要给“收件人”Activity说点什么的话,那么可以通过下面这封“E-mail”来将我们的消息传递出去 Intent intent=new ...

  4. android 21 隐式意图启动系统预定义activity

    Intent intent=new Intent(LoginActivity.this, MainActivity.class);//显示意图启动,显示从一个activity到另一个activity, ...

  5. Android启动activity的4种模式(standard、singleTop、singleTask、singleINstance)

    在AndroidManifest.xml中配置activity时,android:launchMode属性会指定启动activity的模式,有四种: standard singleTop single ...

  6. Android启动Activity的标准Action和标准Category

    Android内部提供了大量标准的Action和Category常量. 其中用于启动Activity的标准Aciton及对应的字符串如下表所示: 启动Activity的标准Aciton Action常 ...

  7. 我的Android进阶之旅------>启动Activity的标准Action和标准Category

    Android内部提供了大量标准的Action和Category常量. 除了参考本文外,您还可以参考了以下链接: http://developer.android.com/reference/andr ...

  8. 查看Android应用的package name和activity name方面

    使用android自动化测试工具monkeyrunner启动应用时,需要填写被测程序的包名和启动的Activity,以下有两种查看应用包名package和入口activity名称的方法:方法一:使用a ...

  9. android的android.intent.action.MAIN

    当我们使用Android Studio创建一个工程并生成一个Activity时,经常可以在清单文件中看到如下的代码 android.intent.action.MAIN:决定应用的入口Activity ...

随机推荐

  1. Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……

    接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...

  2. 知乎大牛的关于JS解答

    很多疑惑一扫而空.... http://www.zhihu.com/question/35905242?sort=created JS的单线程,浏览器的多进程,与CPU,OS的对位. 互联网移动的起起 ...

  3. POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)

    曾写过迭代加深搜索的方法,现在使用在AC自动上跑最短路的方法 dp[i][j]表示状态为到节点i,模式串是否包含的状态为j的最短串的长度,则状态转移方程为: dp[nx][ny] = min(dp[x ...

  4. Arduino101学习笔记(六)—— 高级IO

    1.位移输出函数(8位) 输入value数据后Arduino会自动把数据移动分配到8个并行输出端. 其中dataPin为连接DS的引脚号, clockPin为连接SH_CP的引脚号, bitOrder ...

  5. 汇编学习(三)——汇编语言程序入门

    一.寻址方式 1.概念: 一条指令由操作码和操作数构成,操作码是系统定义好的符号,执行指定的操作,操作数即是指令的对象,而寻址方式就是操作数的指定方式 操作码 目的操作数,源操作数 2.寻址方式的三种 ...

  6. github 使用网址

    [Github教程]史上最全github使用方法:github入门到精通 http://blog.csdn.net/hcbbt/article/details/11651229 githup的使用 h ...

  7. SQLServer 表结构相关查询(快速了解数据库)

    -- 表结构查询 SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号 = a.colord ...

  8. 战斗住的DPS才是DPS,持续的执行力才是执行力

    工作久了,真的发现执行力这个东西太难被贯彻,计划时信心满满,冲劲十足,持续一段时间后就喇叭腔了.

  9. LoadRunner检查点学习实例

    LoadRunner只会检测脚本中事务的执行状态,而实际的事务执行结果则需要通过检查点来完成. 例如一个登录事务,LR只关心事务本身的执行状态,也就是说哪怕实际操作密码错误产生登录失败的业务操作,其事 ...

  10. Jmeter之csv、用户自定义变量以及Query Type分析(八)

    很多童鞋不知道对于Jmeter的Query Type 不知道选哪个,为什么选,怎么选! 下面这边做个简单的分析, 那么首先什么是CSV Data Set Config,有什么用呢? CSV Data ...