Android中跨进程通信之Activity

在Android应用开发中,会用到跨进程通信的方式,什么是跨进程通信,例如,在第三方应用中调用拨号、短信、邮件等,在这个过程中发生数据的传递,当前应用(一个进程)调用另一个应用(第二个进程),这就是Android中的跨进程通信。在Android中,一共有四种跨进程通信的方式,分别是通过Activity、BroadcastReceiver、ContentProvider和AIDL(Android Interface Definition Language),今天主要简述一下通过Activity来实现在一个进程中调用另一个进程并传递数据的实现。

首先新建一个工程,命名为ProjectTwo,这个工程为接收来自第一个进程消息的工程。然后到Mainifest.xml中修改Activity配置:

[html]  view plain copy
  1. <activity  
  2.             android:name=".ProjectTwoActivity"  
  3.             android:label="@string/app_name" >  
  4.             <intent-filter>  
  5.                 <action android:name="com.ryan.test.MYACTION" />  
  6.                 <data android:scheme="info"/>  
  7.                 <category android:name="android.intent.category.DEFAULT" />  
  8.             </intent-filter>  
  9.         </activity>  
其中的action标签指定了该Activity接收的动作,data标签定义的是访问协议,category用默认方式DEFAULT。


然后到Activity中获取从第一个工程传过来的数据:

[java]  view plain copy
  1. public class ProjectTwoActivity extends Activity {  
  2.       
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.           
  8.         TextView valueTextView = (TextView) this.findViewById(R.id.tv_value);  
  9.           
  10.         //getData方法获取的是传过来的URI  
  11.         if (getIntent().getData() != null) {  
  12.             //获取从第一个进程中传递过来的数据  
  13.             String value = getIntent().getExtras().getString("value");  
  14.             System.out.println("----"+value);  
  15.             valueTextView.setText(value);  
  16.         }  
  17.     }  
  18. }  

然后新建一个工程命名为ProjectOne,在Activity中编写代码如下:

[java]  view plain copy
  1. public class ProjectOneActivity extends Activity {  
  2.     //调用另外一个进程中Activity的Action  
  3.     private static final String ACTION = "com.ryan.test.MYACTION";  
  4.       
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.           
  10.         Button invokeButton = (Button) this.findViewById(R.id.btn_invoke);  
  11.         invokeButton.setOnClickListener(new OnClickListener() {  
  12.               
  13.             @Override  
  14.             public void onClick(View v) {  
  15.                 //URI定义了通信协议  
  16.                 Uri uri = Uri.parse("info://test");  
  17.                 //通过Action和URI调用第二个进程中的Activity,并传递数据  
  18.                 Intent invokeIntent = new Intent(ACTION,uri);  
  19.                 invokeIntent.putExtra("value""Data from project one");  
  20.                 startActivity(invokeIntent);  
  21.             }  
  22.         });  
  23.     }  
  24. }  

先运行ProjectTwo到设备上,然后运行ProjectOne,点击按钮后就将数据从进程1(ProjectOne)传递到了进程2(ProjectTwo),到此,就完成了通过Activity在两个进程间进行通信的方式。另外,这里使用的是startActivity,还可以使用startActivityForResult方法进行值回调。


运行效果:

             

Mainifest.xml中的<data android:scheme="info"/> 

我个人的理解就是scheme是对特定协议的封装,简单的说就是确定一种访问规则。比如http:\\A,可以上网根据A来确定打开那个网页;sms:A,可以根据A给谁发短信,等等。因此这里是info配合URI可以调用之前启动Activity中的Action


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值