需求捕魚達人買道具從支付寶扣兩塊錢
思路:(關鍵就是aidl檔案的使用,還有就是捕魚達人隐式啟動服務)
(1)步驟
修改 支付寶
1. 把接口檔案的字尾名改成aidl
2. aidl檔案中所有東西都是public的,不需要也不能自己定義通路修飾符
3. 中間人對象繼承Stub,這個對象已經繼承了Binder并實作了PublicBusiness接口
修改 捕魚達人
1. 把05項目的aidl檔案複制到06項目,然後aidl所在的包名06和05項目必須一緻
2. 把06項目擷取到的中間人對象使用Stub.asInterface強轉
(2)代碼:
//自定義支付寶部分
(1)步驟
1.先在支付寶清單檔案中注冊服務和action,友善捕魚達人隐式調用
<service android:name="com.weixin.aidl_alipay.AlipayService">
<intent-filter>
<action android:name="com.weixin.woyaoqian"/>
</intent-filter>
</service>
2.在支付寶裡面建立AipayService(可以和第一步放一起)(直接 建立一個新的service)
3.在AipayService服務内部實作一個代理人類
定義一個aidl檔案(找到IService.java檔案改字尾aidl,可以看做服務的中間人想暴露什麼方法,就怎麼定義接口),删除public的通路修飾符,修改檔案的擴充名為aidl
public class MyBinder extends PayService.Stub
//gen中PayService.java中
// /** Local-side IPC implementation stub class. */
// public static abstract class Stub extends android.os.Binder implements com.weixin.aidl_alipay.aidl.PayService
//可以看出IService中的stub内部類繼承Binder,實作了PayService,是以下面直接繼承PayService.stub就行了
可以看出IService中的stub内部類繼承Binder,實作了Iservice,是以下面直接繼承IService.stub就行了
package com.weixin.aidl_alipay.aidl;
// Declare any non-default types here with import statements
interface PayService {
//AIDL是用于不同程序間的共享接口,肯定是public,是以不用寫,也不能寫權限
int callPay(String username ,String password,int money,long time);
}
4. 傳回代理人對象
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
MyBinder myBinder = new MyBinder();
return myBinder;
}
5.還有支付寶内部的
public int SafeAlipay(String username ,String password,int money,long time)
,根據獲得不同的名字,錢數, 傳回不同的 code,友善捕魚達人擷取狀态
(2)具體代碼與步驟
首先AndroidStudio使用AIDL跟eclipse還是有差別的,下面講一下具體怎麼操作(有圖有真相)
這樣就能放在自己想要的包名下面
上面隻是用來說明怎麼放置AIDL檔案的,下圖是實際項目中的目錄,注意如果提示加載不了一些檔案,把Build目錄删掉,clean一下就可以了
//AlipayService.java
public class AlipayService extends Service {
//gen中IService.java中
// /** Local-side IPC implementation stub class. */
// public static abstract class Stub extends android.os.Binder implements com.weixin.aidl_alipay.aidl.PayService
//可以看出IService中的stub内部類繼承Binder,實作了PayService,是以下面直接繼承PayService.stub就行了
public class MyBinder extends PayService.Stub
{
@Override
public int callPay(String username ,String password,int money,long time) {
// TODO Auto-generated method stub
return SafeAlipay( username , password, money, time);
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
MyBinder myBinder = new MyBinder();
return myBinder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
System.out.println("支付寶服務被建立");
super.onCreate();
}
@Override
@Deprecated
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
System.out.println("支付寶服務start");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println("支付寶服務onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
System.out.println("支付寶服務被銷毀");
// TODO Auto-generated method stub
super.onDestroy();
}
public int SafeAlipay(String username ,String password,int money,long time)
{
System.out.println("加密username");
System.out.println("加密password");
System.out.println("送出資料到支付寶的伺服器");
if(money >500)
{
return 505;
}
if("abc".equals(username)&&"123".equals(password))
{
return 200;
}
else {
return 300;
}
}
}
//自定義捕魚達人部分
1.先把PayService.aidl放在跟支付寶的同一個包中
2.MainActivity.java中一加載,就采用采用bind的方法綁定開啟服務
Intent intent = new Intent();
//隐式開啟服務
intent.setAction("com.weixin.woyaoqian");
myConn = new MyConn();
boolean state = bindService(intent, myConn, BIND_AUTO_CREATE);
//判斷是否成功連接配接服務
System.out.println("xcqw xcqw state"+state);
3. 實作serviceConnection接口裡面的方法
public class MyConn implements ServiceConnection
{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//兩個程序中間的那塊記憶體一人寫一半,然後動态的左右複制來複制去,下面的這個是代理
//Cast an IBinder object into an com.itheima.text.alipay.IService interface,
//generating a proxy if needed
iService = PayService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
4.按按鈕的時候調用接口裡面的方法
iService.callPay("abc", "123", 300, System.currentTimeMillis());
然後根據不同的code列印不同的通知(支付成功,支付失敗,登陸失敗。。。)
實際項目的目錄(注意aidl的目錄跟支付寶的目錄是一樣的!!!!!!)
//IService.aidl(跟支付寶部分一樣,一定要放在同一個包裡)
// PayService.aidl
package com.weixin.aidl_alipay.aidl;
// Declare any non-default types here with import statements
interface PayService {
int callPay(String username ,String password,int money,long time);
}
//MainActivity.java
public class MainActivity extends Activity {
private MyConn myConn;
private PayService iService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
//隐式開啟服務
intent.setAction("com.weixin.woyaoqian");
myConn = new MyConn();
boolean state = bindService(intent, myConn, BIND_AUTO_CREATE);
//判斷是否成功連接配接服務
System.out.println("xcqw xcqw state" + state);
}
public void payToGet(View view) {
try {
int code = iService.callPay("abc", "123", 300, System.currentTimeMillis());
switch (code) {
case 505:
Toast.makeText(this, "餘額不足", Toast.LENGTH_SHORT).show();
break;
case 200:
Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
break;
case 303:
Toast.makeText(this, "太少了", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "使用者名錯誤", Toast.LENGTH_SHORT).show();
break;
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//兩個程序中間的那塊記憶體一人寫一半,然後動态的左右複制來複制去,下面的這個是代理
//Cast an IBinder object into an com.itheima.text.alipay.IService interface,
//generating a proxy if needed
iService = PayService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}
點我下載下傳源碼