进程之间的通信之隐式意图

来源:互联网 发布:电影撞车影评 知乎 编辑:程序博客网 时间: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"/>启动模式,否则将接收不到数据。


0 0