进线程间的通信,也即是IPC
需要用到aidl,它是android中定义接口的语言
目的是为了解决进程间的通信问题
进程间通信的步骤
1、创建一个XXXService.java文件,在里面定义好接口,把该文件的后缀名改为.aidl
2、去掉接口和方法中的public
3、系统会自动生成一个XXXService.java文件,默认帮助我们生成个Stub类,这个类继承了Binder类同时实现了自己定义的接口
4、用一个类继承Stub,然后实现它里未实现的方法
5、在另一个程序中,要保证两个应用程序的aidl文件是相同的,即两个文件所在的包名相同
6、在第二个应用程序中获取自定义类的对象,通过Stub.asinterface()方法实现代码如下
a应用中的代码:
xxxService.aidl
interface Iserivice1 {
void callTest(String name,String pwd,int money);
}
XXXSereivce.java
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.Toast;
public class PayService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyService();
}
@Override
public void onCreate() {
super.onCreate();
}
public void callPay(String name,String pwd,int money){
//boolean flag = false;
if("zhangsan".equals(name) && "123".equals(pwd) && (money > 0)){
//Toast.makeText(getApplication(), "充值成功",0).show();
//flag = true;
System.out.println("充值成功");
//return flag;
}else {
//Toast.makeText(getApplication(), "充值失败",0).show();
System.out.println("充值失败");
//return flag;
}
}
class MyService extends Stub{
@Override
public void callTest(String name, String pwd, int money){
callPay(name,pwd,money);
}
}
}
b应用的代码如下:
MainActivity.java
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
public class MainActivity extends Activity {
private Iserivice1 iserivice1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.wdj.buyhaoo");
startService(intent);
MyConn conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);
}
public void click(View v) {
try {
iserivice1.callTest("zhangsan","123", 123);
} catch (RemoteException e) {
e.printStackTrace();
}
}
class MyConn implements ServiceConnection{
public void onServiceConnected(ComponentName name, IBinder service) {
iserivice1 = Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName name) {
}
}
}
注意:需要在a应用中的清单文件中注册服务
<service android:name="com.wdj.alipay.PayService">\
<intent-filter>
<action android:name="com.wdj.buyhaoo"></action>
</intent-filter>
</service>