进程之间的通信之隐式意图
来源:互联网 发布:电影撞车影评 知乎 编辑:程序博客网 时间:2024/05/21 15:01
在启动一个Activity的时候我们通常使用显式意图进行进行两个Activity之间的跳转,在一个应用中使用显示意图的优势是非常明显的,那隐士意图是在什么时候使用呢?当我们从一个应用的Activity跳转到另一个应用程序的Activity的时候,这时候需要用到隐式意图,他不但可以进行不同APP页面之间的跳转,还可以传递数据,在不同进程之间进行通信。首先来看看Activity在清单文件中对应的常见参数配置。
一、Activity在清单文件中的属性
<activity android:name=".activity.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <action android:name="com.demo.action.ONE_ACTIVITY"></action> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="test" android:host="mobile" android:port="1024" android:path="/shopping" android:mimeType="string"> </intent-filter> </activity>1、 action:表示此Activity的意图属性,除了系统给我提供的特定的之外,可以任意定义。例如;
<action android:name="com.demo.action.YINSHIYITU"></action>就是一个自定义的action,他的作用就是过滤匹配内容。
2、data语法
schem:表示Scheme 协议名称
host:表示Scheme作用于哪个地址域
port:表示该路径的端口
path:表示指定的页面
上述清单文件按照参数拼接起来来就是:test://mobile:1024/shopping。是不是类似于一个网站:https://www.baidu.com他规定了Action传递数据的格式,这些参数就是我们传递数据所要携带的参数,他的数据可以在当一个应用Activity跳转至另一个应用Activity是否被另一个应用的捕获到。data可以有多个,只需匹配其中一个即可。
在Android规定了以下格式数据:
tel://:号码数据格式,后跟电话号码。
mailto://:邮件数据格式,后跟邮件收件人地址。
smsto://:短息数据格式,后跟短信接收号码。
content://:内容数据格式,后跟需要读取的内容。
file://:文件数据格式,后跟文件路径。
除此之外我们还可以自定义schem;
注意:如果scheme没有指定,那其它的属性均无效;如果host没有指定,那么port,path等均无效;
二、启动其他进程的Activity
1、创建intent,并且设置另一个应用对应的Action。这个Action一定是要启动的Activity清单文件中配置的Action。
Intent intent = new Intent("com.demo.action.TWO_ACTIVITY");
2、添加启动模式,为默认启动模式。
intent.addCategory(Intent.CATEGORY_LAUNCHER);
3、设置数据
intent.setData(Uri.parse("test://mobile:1024/shopping?id=100100"));
注意:设置数据的格式一定要和清单文件中的格式对应,URI和intent-filter匹配会进行部分匹配,intent-filter中没有的就不匹配了,这样达到反向限定Intent的作用,例如上面的也可以写成intent.setData("test://mobile");这两个的区别是后者会匹配部分,前者会匹配全部内容。
4、指定包名启动
ComponentName cn = new ComponentName("com.demo.two","com.example.administrator.glidedemo.MainActivity");
参数1:要启动的应用的Activity对应的包名;
参数2:要启动的Activity对应的类名;
5、设置启动包名
intent.setComponent(cn);
6、启动Activity
tartActivity(intent);
三、Activity的数据接收
如果在Activity要跳转的第一个页面清单文件设置了data,那个就必须在另一个跳转到的Activity接收参数,如果清单文件和设置的数据不对应就会抛出ActivityNotFoundException的异常。接收方式如下:
this.getIntent().getScheme();//获得Scheme名称
this.getIntent().getDataString();//获得Uri全部路径
这样,在两个进程之前可以进行数据传递,参数验证。
四、隐式意图数据传递的应用
现在有这样一个需求,通过当前的界面启动第三方应用的页面,并且传递数据,当第三方应用完成页面交互,数据交互后,点击确定,关闭当前页面,回到原来的页面并且携带数据。
1、使用隐式意图启动第三方Activity,并使用intent传递数据。
Intent intent = new Intent("testdemo"); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.putExtra("data", "formShoppingApp"); intent.setData(Uri.parse("test://mobile")); ComponentName cn = new ComponentName("com.example.administrator.glidedemo", "com.example.administrator.glidedemo.MainActivity"); intent.setComponent(cn); startActivity(intent);传递的数据这里传递的是字符串,当前也可以是其他的,如对象,集合等等。
2、第三方APP进行接收,首先进行uri判断,接收方式:
Uri data = getIntent().getData();
然后通过:getIntent().getStringExtra(String str);获取数据,得到结果。
3、当交互结束的时候,通过intent设置数据:
Intent intent = new Intent();
intent .putExtra("result", resultBean);
setResult(RESULT_CANCELED,intent );
finish();
4、当第三方应用关闭的时候,在当前应用中使用:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); }进行接收,做出相应的处理。
注意:必须保证第三方应用中要跳转的Activity的启动模式是默认的<category android:name="android.intent.category.LAUNCHER"/>启动模式,否则将接收不到数据。
- 进程之间的通信之隐式意图
- 进程之间的通信之AIDL
- 进程之间的通信
- 进程之间的通信
- 进程之间的通信
- 进程之间的通信
- 进程之间的通信
- 进程通信之邮槽之间的通信
- Android之隐式意图的设置
- linux进程之间的通信方式学习之概要
- 进程之间的通信技术
- 进程之间的通信方法
- 进程之间的通信方式
- 关于进程之间的通信
- 进程之间的通信途径
- 进程之间的通信--管道
- 进程之间的通信AIDL
- 进程之间的通信-剪切板
- 欢迎使用CSDN-markdown编辑器
- Mybatis Generator实现过程
- linux shell “(())” 双括号运算符使用
- 阿里面试回来,想和Java程序员谈一谈
- Toolbar实现完全自定义
- 进程之间的通信之隐式意图
- Problem A: 编写函数:三个数的最大最小值-1382
- iOS基础之OC简单控件知识了解
- 史上最全synchronized用法详解
- python脚本中的#!/usr/bin/python
- mysql监控的chk_mysql.sh脚本内容for show status
- 关于Android模拟器获取root权限的解决办法
- 面试中经常出现的数组去重的一些方法
- (cogs 613 火车站饭店)<树形DP>