//自定义服务继承系统服务Service
package com.example.day0329_alipayseverice;
import com.example.day0329_alipayseverice.PublicBusiness.Stub;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
//创建一个AlipayService继承Service(要在清单文件中注册)
//<application
//android:allowBackup="true"
//android:icon="@drawable/ic_launcher"
//android:label="@string/app_name"
//android:theme="@style/AppTheme" >
//<activity
// android:name="com.example.day0329_alipayseverice.MainActivity"
// android:label="@string/app_name" >
// <intent-filter>
// <action android:name="android.intent.action.MAIN" />
//
// <category android:name="android.intent.category.LAUNCHER" />
// </intent-filter>
//</activity>
//<service android:name="com.example.day0329_alipayseverice.AlipayService">
// <intent-filter >
// <action android:name="com.qianfeng.severice"/>
// </intent-filter>
//</service>
//</application>
public class AlipayService extends Service {
//
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new ZhiFuBao();
}
//定义一个中间人,来是其他应用可以访问pay()方法
//这是要定义一个接口PublicBusiness,要把接口java类后缀名改为adil,
//这是涉及到了adil,后面附笔记说明
class ZhiFuBao extends Stub{
@Override
public void pay() throws RemoteException {
// TODO Auto-generated method stub
//调用外部类的pay()方法
AlipayService.this.pay();
}
}
public void pay(){
Log.i("xxxxx","购买成功");
}
}
//adil
package com.example.day0329_alipayseverice;
interface PublicBusiness {
void pay();
}
//第三方应用
package com.example.day0329_alipay;
import com.example.day0329_alipayseverice.PublicBusiness;
import com.example.day0329_alipayseverice.PublicBusiness.Stub;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
PublicBusiness pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.qianfeng.severice");
bindService(intent, new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
pb =Stub.asInterface(service);
}
}, BIND_AUTO_CREATE);
}
public void click(View v){
try {
pb.pay();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//步骤
AIDL
* Android interface definition language
* 安卓接口定义语言
* 作用:跨进程通信
* 应用场景:远程服务中的中间人对象,其他应用是拿不到的,那么在通过绑定服务获取中间人对象时,就无法强制转换,使用aidl,就可以在其他应用中拿到中间人类所实现的接口
##支付宝远程服务
1. 定义支付宝的服务,在服务中定义pay方法
2. 定义中间人对象,把pay方法抽取成接口
3. 把抽取出来的接口后缀名改成aidl
4. 中间人对象直接继承Stub对象
5. 注册这个支付宝服务,定义它的intent-Filter
##需要支付的应用
1. 把刚才定义好的aidl文件拷贝过来,注意aidl文件所在的包名必须跟原包名一致
2. 远程绑定支付宝的服务,通过onServiceConnected方法我们可以拿到中间人对象
3. 把中间人对象通过Stub.asInterface方法强转成定义了pay方法的接口
4. 调用中间人的pay方法