天天看點

簡單的AIDL的使用需求捕魚達人買道具從支付寶扣兩塊錢 

需求捕魚達人買道具從支付寶扣兩塊錢 

思路:(關鍵就是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的使用需求捕魚達人買道具從支付寶扣兩塊錢 
簡單的AIDL的使用需求捕魚達人買道具從支付寶扣兩塊錢 
簡單的AIDL的使用需求捕魚達人買道具從支付寶扣兩塊錢 

上面隻是用來說明怎麼放置AIDL檔案的,下圖是實際項目中的目錄,注意如果提示加載不了一些檔案,把Build目錄删掉,clean一下就可以了

簡單的AIDL的使用需求捕魚達人買道具從支付寶扣兩塊錢 

//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的目錄跟支付寶的目錄是一樣的!!!!!!)

簡單的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
        }
    }
}
           

點我下載下傳源碼