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培训官网。
核心代码:
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培训官网。
相关文章推荐
- android中跨进程通讯之--访问其他应用程序的Activity
- Android跨进程访问(AIDL服务)
- android怎样多个application共享一个进程和异步访问UI的规则及方法
- Android跨进程访问(四大组件)- Activity跨进程访问
- Android中AIDL跨进程访问机制
- Android34_跨进程访问AIDL
- Android查看应用数据或者跨进程查看和访问数据
- android中跨进程数据传递和访问
- Android 通过配置相同的UUid访问不同进程小结
- Android跨进程访问资源
- Android不同进程间的访问AIDL
- Android跨进程访问-Service跨进程访问(AIDL服务)
- Android之五种进程、访问修饰符、Intent七大属性
- android 跨进程访问service方法(AIDL)
- Android跨进程访问(四大组件)- Broadcast Receiver跨进程访问
- Android进程、访问修饰符、Intent
- Android-AIDL(跨进程访问
- iis提示“另一个程序正在使用此文件,进程无法访问”解决办法
- C#关于"该进程无法访问文件,因为该文件正由另一进程使用"的错误的一点心得(示例)
- 如何访问其他进程的 socket 句柄?