android的跨进程访问

一、通过一个Activity打开另一个Activity:
核心代码:
Intent intent = new Intent(); 
intent.setComponent(new ComponentName("包名","包名.类名"));
intent.setAction(Intent.ACTION_VIEW); startActivity(intent);
但是如果要打开的第三方程序机器上并没有安装就会报错:ActivityNotFoundException
改良一下代码
实例为程序A中 打开程序B的一个Activity
try { 
Intent intent = new Intent(); 
intent.setComponent(new ComponentName("com.B","com.B.Activity"));
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent); 
} catch (ActivityNotFoundException e) 

//自定义处理 通常为下载这个B程序
}
二:aidl 跨进程访问服务
      aidl是Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。
首先我这里是引用的别人的一个案例(真的很经典也很简洁)(如果侵权我深表歉意 请留言我将删除)
这里的示例我还是用程序A去访问程序B的服务
首先在A B两个程序中加入aidl文件 IAidlServerService.aidl
下面能看出来aidl文件和java几乎无区别 可以用java写好改个后缀~
package com.cooper.aidl; 
import com.aidl.client.main.Book; interface IAidlServerService   这个是客户端(调用方)的 (程序A)

String sayHello(); 
Book getBook(); 
int getPrice();
}
package com.cooper.aidl; 
import com.aidl.server.main.Book;   这个是服务端(被调用方)的(程序B)
interface IAidlServerService 

String sayHello(); 
Book getBook(); 
int getPrice(); 
}
补充再加入aidl文件后eclipse会自动在gen目录下生成一个java文件 IAidlServerService.java
这个类的细节请单独百度(谷歌)本文不做累述
既然是程序A跨进程访问程序B的服务 自然程序B中要有一个Service
下面是程序B的服务类
public class AidlServerService extends Service 

@Override public 
IBinder onBind(Intent intent)
{
return mBinder;

private IAidlServerService.Stub mBinder = new Stub()  //核心在这里 大家能看到这里的对象是一个binder
{ //binder本身就是一个传送数据的载体
@Override
public String sayHello() throws RemoteException  //这里能看到下面复写的3个方法都是aidl文件里定义的,这里进行赋值
{
return "Hello android AIDL";

@Override
public Book getBook() throws RemoteException 

Book mBook = new Book(); 
mBook.setBookName("Android 2 书名"); mBook.setBookPrice(50); 
return mBook;

@Override public int getPrice() throws RemoteException 

return 99; 

}; 
}
补充说明:第二个方法传递的为实体类Book (大家常说的bean、 entry、model ) 是需要序列化的 android用的是Parcelable
不明白的童鞋可自行百度(谷歌)这里也不做累述
下面是程序A进行调用了
Intent service = new Intent("com.cooper.aidl.IAidlServerService"); 
bindService(service, mConnection, BIND_AUTO_CREATE); //这里是绑定服务
第二个参数是连接 请仔细看
private ServiceConnection mConnection = new ServiceConnection() 

public void onServiceDisconnected(ComponentName name) { mIaidlServerService = null; 

public void onServiceConnected(ComponentName name, IBinder binder) 

mIaidlServerService = IAidlServerService.Stub.asInterface(binder); // 通过binder获得数据
try { 
String mText = "sayHello(): " + mIaidlServerService.sayHello() + "\n";  //第一个方法获得的字符串
mText += "书名: " + mIaidlServerService.getBook().getBookName() + "\n"; //第二个方法获得的对象book
mText += "aaa" + mIaidlServerService.getPrice(); mTextView.setText(mText); //第三个方法获得的int型数字
} catch (RemoteException e) 

e.printStackTrace();


};

本文由上海java培训官网整理,更多精彩请浏览上海it培训官网。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值