您的位置:首页 > 移动开发 > Android开发

android的跨进程访问

2014-09-20 11:02 85 查看
一、通过一个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培训官网。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: