Activity跨进程访问

一、访问其他应用程序的Activity

Activity的跨进程访问与进程内访问略有不同。虽然它们都需要Intent对象,但跨进程访问并不需要指定Context对象和Activity的 Class对象。

而需要指定的是要访问的Activity所对应的Action(一个字符串),有些Activity还需要传递一个Uri数据。在android系统中有很多应用程序提供了可以跨进程访问的Activity。

例如,下面的代码可以直接调用拨打电话的Activity。

[java]  view plain  copy
 print ?
  1. //电话号码  
  2. String phoneNum = phoneNumEdit.getText().toString().trim();  
  3. //打电话  
  4. Intent callIntent = new Intent(Intent.ACTION_CALL);  
  5. callIntent.setData(Uri.parse("tel:"+phoneNum));  
  6. startActivity(callIntent);  

有些应用程序中的Activity有时还会返回数据。

例如调用系统相机时,可以将拍照结果返回。可以在调用拍照的Activity中onActivityResult回调方法中获取到拍到的照片数据。代码如下:

[java]  view plain  copy
 print ?
  1. //拍照  
  2. Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  3. startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);  

[java]  view plain  copy
 print ?
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.   
  4.     //如果去拍照请求返回  
  5.     if (requestCode == REQUEST_TAKE_PHOTO) {  
  6.               
  7.         //如果结果返回成功  
  8.         if (resultCode == RESULT_OK) {  
  9.   
  10.             Bitmap bmp = (Bitmap) data.getExtras().get("data");  
  11.             takeResultImg.setImageBitmap(bmp);  
  12.         }  
  13.     }  
  14.     super.onActivityResult(requestCode, resultCode, data);  
  15. }  


二、将Activity共享给其他应用程序访问

在调用拨号程序的代码中使用了一个Intent.ACTION_CALL常量,常量定义如下:

[java]  view plain  copy
 print ?
  1. public static final String ACTION_CALL = "android.intent.action.CALL";  

在调用相机程序的代码中使用了一个MediaStore.ACTION_IMAGE_CAPTURE常量,常量定义如下:

[java]  view plain  copy
 print ?
  1. public final static String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";  

这些常量是一个字符串常量,也是跨进程调用Activity的关键。如果在应用程序中要共享某个Activity,需要为这个 Activity指定一个标识ID,即Action。在其他的应用程序中只要通过这个 Action就可以找到与Action对应的Activity,并通过startActivity方法来启动这个Activity。

下面先看一下如何将应用程序的Activity共享出来,读者可按以下步骤共享Activity:


1、在AndroidManifest.xml文件中给要共享的Activity指定Action和访问协议

Action要使用<action>标签的android:name属性中指定,访问协议需要使用<data>标签的android:scheme属性来指定。前面拨打电话时的Intent.ACTION_CALL常量就是Action,“tel”就是访问协议。实例代码如下:

[html]  view plain  copy
 print ?
  1. <activity android:name="com.sarnasea.interprocess.ShareActivity">  
  2.     <intent-filter>  
  3.         <action android:name="com.sarnasea.interprocess.MYACTION"/>  
  4.         <data android:scheme="message"/>  
  5.         <category android:name="android.intent.category.DEFAULT"/>  
  6.     </intent-filter>  
  7. </activity>  

在配置AndroidManifest.xml时要注意,不能在同一个<activity>中配置多个动作,否则会覆盖MAIN动作以使该程序无法正常启动(虽然其他应用程序调用是正常的)。

从上面的代码可以看出,<action>标签的android:name属性值是 com.sarnasea.interprocess.MYACTION,这就是该Activity自定义的动作。<data>标签指定了Url的协议message(可选)。

2.  获得其他应用程序传递过来的数据

在要共享的Activity中通过getIntent().getData().getHost()方法可获得访问协议后的Uri的主体部分(任意的字符串)。

也可以从getIntent()中获得其他应用程序传递过来的数据(Bundle)。实例代码如下:

[java]  view plain  copy
 print ?
  1. // 获得其他应用程序传递过来的数据  
  2. Uri data = getIntent().getData();  
  3. if (data != null) {  
  4.       
  5.     //获得Host,也就是message://后面的主体内容  
  6.     String host = data.getHost();  
  7.     Toast.makeText(this, host, Toast.LENGTH_SHORT).show();  
  8. }  
  9.   
  10. Bundle bundle = getIntent().getExtras();  
  11. if(bundle != null){  
  12.       
  13.     //获得其他应用程序调用该Activity时传递过来的Extras数据  
  14.     String value = bundle.getString("value");  
  15.     Toast.makeText(this, value, Toast.LENGTH_SHORT).show();  
  16. }  

到这步该Activity就对外共享成功了,在其他应用程序中可以这样来访问这个Activity(类似上边调用拨号程序一样)。实例代码如下:

[java]  view plain  copy
 print ?
  1. Intent intent = new Intent();  
  2. intent.setAction("com.sarnasea.interprocess.MYACTION");   
  3. intent.setData(Uri.parse("message://Hello World!"));  
  4. intent.putExtra("value""yanglu");  
  5. startActivity(intent);  

同样,也可以和调用相机一样,采用startActivityForResult(Intent intent, int requestCode)获取共享Activity关闭时返回的数据。这点和同一进程中是一致的,只需要在该共享Activity finish之前调用setResult(int resultCode, Intent data)即可,示例代码如下:

[java]  view plain  copy
 print ?
  1. Intent data = new Intent();  
  2. // 设置要返回的数据  
  3. data.putExtra("result""关闭Activity时返回的数据");  
  4. // 设置返回码和Intent对象  
  5. setResult(Activity.RESULT_OK, data);  
  6. // 关闭Activity  
  7. finish();  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值