4-AIII–Service跨程式通訊:aidl

張風捷特烈發表於2018-08-25

零、前言

[1]. aidl:Android Interface definition language(安卓介面定義語言),目的:提供程式間的通訊介面
[2]. 一個應用提供服務:稱為服務應用,一個使用服務:稱為客戶應用
[3]. 解決客戶應用如何呼叫服務應用的服務方法時,便是aidl用武之地
[4]. 服務端開啟驗證服務,客戶端輸入使用者名稱和命名及數值,驗證使用者名稱:abc,密碼:123,數值<5000

aidl.gif
aidl.png

一、服務端程式碼實現:

1.com/toly1994/aiii_service/IPayAidlInterface.aidl
// IPayAidlInterface.aidl
package com.toly1994.aiii_service;

// Declare any non-default types here with import statements

interface IPayAidlInterface {
    //暴露方法
   boolean pay(String name, String pwd, int money);
}

2.PayService服務
public class PayService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {
        return new MyBinder();
    }

    public class MyBinder extends IPayAidlInterface.Stub {

        @Override
        public boolean pay(String name, String pwd, int money) {
            return "abc".equals(name) && "123".equals(pwd) && money < 5000;
        }
    }
}
3.註冊:app/src/main/AndroidManifest.xml
<service android:name=".aidl.PayService"
         android:enabled="true"
         android:process=":push"
         android:exported="true">
    <intent-filter>
        <action android:name="www.toly1994.com.pay"></action>
    </intent-filter>
</service>
4.AidlActivity:啟動服務
public class AidlActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startService(new Intent(this, PayService.class));
    }
}

二、客戶端

1. MainActivity
public class MainActivity extends AppCompatActivity {

    @BindView(R.id.et_acc)
    EditText mEtAcc;
    @BindView(R.id.et_pass)
    EditText mEtPass;
    @BindView(R.id.et_num)
    EditText mEtNum;
    @BindView(R.id.btn_buy)
    Button mBtnBuy;
    private ServiceConnection mConn;
    private IPayAidlInterface mService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        bindService();
    }

    /**
     * 繫結遠端服務
     */
    private void bindService() {
        Intent intent = new Intent();
        //坑點:5.0以後要加 服務包名,不然報錯
        intent.setPackage("com.toly1994.aiii_service");
        intent.setAction("www.toly1994.com.pay");
        mConn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {

                mService = IPayAidlInterface.Stub.asInterface(service);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
            }
        };
        bindService(intent, mConn, BIND_AUTO_CREATE);
    }


    @OnClick(R.id.btn_buy)
    public void onViewClicked() {
        try {
            boolean isPay = mService.pay(mEtAcc.getText().toString(),
                    mEtPass.getText().toString(),
                    Integer.parseInt(mEtNum.getText().toString()));
            
            Toast.makeText(this, isPay ? "購買成功" : "購買失敗", Toast.LENGTH_SHORT).show();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        unbindService(mConn);
        super.onDestroy();
    }
}
2.com/toly1994/aiii_service/IPayAidlInterface.aidl
// IPayAidlInterface.aidl
package com.toly1994.aiii_service;

// Declare any non-default types here with import statements

interface IPayAidlInterface {
    //暴露方法
   boolean pay(String name, String pwd, int money);
}

附錄、客戶端佈局檔案:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >

    <EditText
        android:id="@+id/et_acc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入賬號" />
    <EditText
        android:id="@+id/et_pass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入密碼" />
    <EditText
        android:id="@+id/et_num"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="1"
        android:hint="請輸入數額" />
    <Button
        android:id="@+id/btn_buy"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="確定" />

</LinearLayout>

注意坑點:5.0以後用action啟動服務要加服務所在應用的包名,不然報錯


後記、

1.宣告:

[1]本文由張風捷特烈原創,轉載請註明
[2]歡迎廣大程式設計愛好者共同交流
[3]個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正
[4]你的喜歡與支援將是我最大的動力

2.連線傳送門:

更多安卓技術歡迎訪問:安卓技術棧
我的github地址:歡迎star
簡書首發,騰訊雲+社群同步更新
張風捷特烈個人網站,程式設計筆記請訪問:http://www.toly1994.com

3.聯絡我

QQ:1981462002
郵箱:1981462002@qq.com
微信:zdl1994328

4.歡迎關注我的微信公眾號,最新精彩文章,及時送達:
公眾號.jpg


相關文章