在启动一个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"/>启动模式,否则将接收不到数据。