4-AIII–Service跨程式通訊:aidl
零、前言
[1]. aidl:Android Interface definition language(安卓介面定義語言),目的:提供程式間的通訊介面
[2]. 一個應用提供服務:稱為服務應用,一個使用服務:稱為客戶應用
[3]. 解決客戶應用如何呼叫服務應用的服務方法時,便是aidl用武之地
[4]. 服務端開啟驗證服務,客戶端輸入使用者名稱和命名及數值,驗證使用者名稱:abc,密碼:123,數值<5000
一、服務端程式碼實現:
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.歡迎關注我的微信公眾號,最新精彩文章,及時送達:
相關文章
- Android程式間通訊,AIDL工作原理AndroidAI
- Aidl程式間通訊詳細介紹AI
- Android跨程式通訊Android
- 使用AIDL實現跨程式介面回掉AI
- Webview獨立程式並通過AIDL實現資料通訊WebViewAI
- [Android]你不知道的Android程式化(4)--程式通訊AIDL框架AndroidAI框架
- android AIDL程式間通訊(只介紹了簡單資料型別)AndroidAI資料型別
- 四大元件之Service_AIDL元件AI
- 【React】元件通訊 - 跨層通訊React元件
- 詳解 CmProcess 跨程式通訊的實現
- 跨源通訊、跨域訪問跨域
- android native service編寫及兩個服務程式通訊Android
- 一行程式碼實現Android的跨程式呼叫與通訊行程Android
- 不同頁面通訊與跨域跨域
- 瀏覽器跨標籤通訊瀏覽器
- EventBus,輕鬆實現跨元件跨執行緒通訊元件執行緒
- 程式通訊
- web多應用下跨域通訊視訊教程Web跨域
- React Native原理之跨端通訊機制React Native跨端
- 跨鏈通訊可分為幾個類別?
- Kubernetes安裝之四:flanneld跨主機通訊
- 跨標籤頁通訊以及實戰排坑
- PHP程式間通訊PHP
- 程式間通訊——LINUXLinux
- 程式間通訊(Socket)
- 程式間的通訊
- Android 多程式通訊Android
- Linux程式間通訊Linux
- Android AIDL原理AndroidAI
- AIDL淺析AI
- [iptables] 基於iptables實現的跨網路通訊
- 微服務 - 概念 · 應用 · 通訊 · 授權 · 跨域 · 限流微服務跨域
- 程式間通訊--訊息佇列佇列
- 什麼是程式間通訊?Linux程式間通訊有幾種方式?Linux
- 程式間通訊是什麼?Linux程式間通訊有幾種方式?Linux
- IPC-程式間通訊
- 程式間通訊簡介
- Android 程式之間通訊Android