zoukankan      html  css  js  c++  java
  • Android中进程之间通信的机制Activity

    Activity是android系统的三大组件之一,他可以跨进程去调用别的进程中的activity。

    1.前提:

          被调用的activity必须是共享的。在电话拨号器的例子中,

    1. ntent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678"));  
    2. startActivity(callIntent); 

    执行完这些代码后,该应用程序就会去调用系统的拨号功能,实现拨号。其实系统的拨号功能也是有一个activity实现的,系统把这个activity共享了,给他注册了一个id号叫做:android.intent.action.CALL

    2.怎么实现activity的共享

           就是给activity注册一个唯一标识符action。在功能配置文件中的意图过滤器中配置他,他的元素名称叫做action,我们可以称之为动作,他的作用是告诉android做什么,就是要去调用那个activity实现功能。

    3.如何调用别的进程中的activity

           这里就要用到意图了,intent是一种运行时绑定机制,他有效地降低了android中组件的耦合性。意图通过意图,程序可以向android系统表达某种意愿或诉求,让系统执行某些动作,他还可以激活新的activity或者让activity执行新的动作。intent的构造函数有一个是这样的Intent(String action, Uri uri),第一个参数是共享的activity的唯一标识符。第二个参数是uri。它包括协议和数据。activity的Intent-filter是相 对应的,action能够匹配出由那个activity来执行动作,uri来告诉这个activity具体干什么。因为一个activity可以配置多个 Intent-filter,例如记事本程序的NoteEditor activity有两个filter -- 一个启动并显示一个特定的记录给用户查看或编辑, 另一个启动一个空的记录给用户编辑.

    4.如何传递数据

           所有的数据都是通过intent来传递的,但是我们可以根据实现方式的不同来划分为两种方式,第一种直接在uri中绑定数据,通常为协议头+数据,例如Uri.parse("tel:12345678")); 另一种方式是通过intent的put**方法来绑定数据或者intent直接绑定bundler对象。

    5.当调用一个新的activity之后,如何获得这个activity的返回值

    使用startActivityForResult方法来启动其他应用程序的Activity,以便获得Activity的返回值

    然后在InvokeActivity中使用下面的代码来调用Main。

    1. intent = new Intent("net.blogjava.mobile.MYACTION", Uri.parse("info://调用其他应用程序的Activity"));  
    2. intent.putExtra("value", "调用成功");  
    3. startActivityForResult(intent, 1);             // 1为请求码

    获得返回值:必须要实现onActivityResult方法

    1. protected void onActivityResult(int requestCode, int resultCode, Intent data)  
    2. {  
    3.    Toast.makeText(this, "返回值:" + data.getExtras().getString("result"),  
    4.            Toast.LENGTH_LONG).show();  
    5. }

    总结:跨进程访问Activity(访问其他应用程序中的Activity)主要是通过一个Action来完成的,如果要传递数据,还需要指定一个 Uri。当然,传递数据也可以通过Intent来完成。传递数据的过程可以是双向的。如果要想从调用的Activity中返回数据,就需要使用 startActivityForResult方法来启动Activity了。

  • 相关阅读:
    MVC动态添加文本框,后台使用FormCollection接收
    使用结构struct作为Dictionary<TKey,TValue>的键
    扩展方法的几个实例,扩展基本类型、接口、通过反射让扩展方法使用私有成员等
    使用Enum.TryParse()实现枚举的安全转换
    .NET泛型04,使用Lazy<T>实现延迟加载
    .NET泛型03,泛型类型的转换,协变和逆变
    .NET泛型02,泛型的使用
    dd、split、csplit命令
    seq命令
    uniq命令
  • 原文地址:https://www.cnblogs.com/carbs/p/2571258.html
Copyright © 2011-2022 走看看