1. 程式人生 > >安卓IPC之aidl使用(二)---aidl本地實現

安卓IPC之aidl使用(二)---aidl本地實現

一直都以為aidl必須寫一個服務端是吧,那樣豈不是有時候需求怎麼實現,如果app的service和client屬於同一app,那樣實現是不是更好的滿足我們的需求呢。
這裡寫圖片描述

本例子我們實現一個很簡單的例子:實現2個數相加

// ILocal.aidl
package com.losileeya.localaidl;
// Declare any non-default types here with import statements

interface ILocal {
   int add(in int num1,in int num2);
}

因為不需要在寫service了,所以我們這裡需要寫LoaclAidlService

package com.losileeya.localaidl;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;

/**
 * User: Losileeya (
[email protected]
) * Date: 2016-07-10 * Time: 11:09 * 類描述: * * @version : */
public class LoaclAidlService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return new MBinder(); } class MBinder extends ILocal.Stub{ @Override public
int add(int num1, int num2) throws RemoteException { return doAdd(num1,num2); } } private int doAdd(int num1, int num2) { return num1+num2; } public class LocalConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { service= (IBinder) ILocal.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { name=null; } } }

然後使用也很簡單

package com.losileeya.localaidl;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ILocal iLocal=null;
    private EditText etNum1,etNum2,etResult;
    private Button btnCalculate;
    private LocationConnection connection=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        bindService();
    }

    private void initView() {
        etNum1= (EditText) findViewById(R.id.et_num1);
        etNum2= (EditText) findViewById(R.id.et_num2);
        etResult= (EditText) findViewById(R.id.et_result);
        btnCalculate= (Button) findViewById(R.id.btn_calculate);
        btnCalculate.setOnClickListener(this);
    }

    private void bindService() {
        connection=new LocationConnection();
        Intent intent=new Intent();
        intent.setComponent(new ComponentName("com.losileeya.localaidl","com.losileeya.localaidl.LoaclAidlService"));
        bindService(intent,connection, Context.BIND_AUTO_CREATE);

    }
    class LocationConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iLocal = ILocal.Stub.asInterface((IBinder)service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            iLocal=null;
        }
    };
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
        connection=null;
    }

    @Override
    public void onClick(View v) {
        int num1=Integer.parseInt(etNum1.getText().toString().trim());
        int num2=Integer.parseInt(etNum2.getText().toString().trim());

        try {
            int result=iLocal.add(num1,num2);
            etResult.setText(result+"");

        } catch (RemoteException e) {
            e.printStackTrace();
            etResult.setText("失敗");
        }
    }
}

是不是和前面一個例子使用起來沒有什麼兩樣,只不過把LoaclAidlService搬到客戶端來了(2合一了是嗎)。仔細一看,還是有一點的區別,請仔細對照程式碼自行體會。

清單配置LoaclAidlService

 <service android:name=".LoaclAidlService"
            android:process=":remmote">
            <intent-filter>
                <action android:name="com.losileeya.localaidl.LoaclAidlService"></action>
            </intent-filter>
        </service>

這裡把service 標記為android:process=”:remmote”,這樣aidl就能被遠端呼叫了。

效果如下:

相關推薦

-ListView側滑SwipeMenuListView新增menu.getViewType()屬性控制是否側滑

這篇部落格記錄的是曾經做過的一個專案,需求是一個list裡面要求有的部分可以側滑刪除,有的部分不可以,側滑用的是開源專案SwipeMenuListView在網上查了些資料,根據這個需求又自己做了調整,終於完美的解決了,好,上程式碼。 1.在gradle中新增depend

開發學習筆記:Android Stuidio無法引用Intent來創建對象,出現cannot resolve xxx

編譯器 port stact 消失 click first 紅色 xxx font 筆者在進行安卓開發時,發現自己的代碼語法完全沒有問題。尤其是創建intent對象的時候,語法完全是正確的,但是Android Stuidio卻顯示報錯,Intent類顯示為紅色,如圖所示:

非同步程式設計學習-通過Synchronize實現執行緒安全的多執行緒

本文是非同步程式設計學習之路(二)-通過Synchronize實現執行緒安全的多執行緒,若要關注前文,請點選傳送門: 非同步程式設計學習之路(一)-通過Thread實現簡單多執行緒(執行緒不安全) 上篇我們通過Thread實現了幾種執行緒不安全的多執行緒寫法,導致最後的結果與預期的值不一樣。

IPCaidl使用---aidl本地實現

一直都以為aidl必須寫一個服務端是吧,那樣豈不是有時候需求怎麼實現,如果app的service和client屬於同一app,那樣實現是不是更好的滿足我們的需求呢。 本例子我們實現一個很簡單的例子:實現2個數相加 // ILocal.aidl pac

我的進階

    這周結束了“活動”,開始了UI的征程。     1、七大控制元件           踩的兩個小坑          第一個,ImageView即圖片控制元件,名稱必須以字母開頭。如1img不行,而img2可以,倒是和變數名的命名相類似。          第

CocosCreatorKUOKUO分享打包成功過程3

很多小夥伴卡在了安卓打包的過程,被折磨的欲仙欲死,面對小夥伴的一些問題,有時候我也感覺莫名其妙的,console.log(滑稽)。 今天我把自己成功打包的過程詳細滴發一遍,供大家參考。O(∩_∩)O~~ 電腦Windows10,64位 CocosCreator引擎版本v2.0.5 然

使用記錄筆記1ndk使用Java呼叫c++程式碼

1.在Java中新建一個Utils類     1)指定路徑下新建一個資料夾 ,包名為Utils     2)   新建類 NativeUtils.java package com.sample.Utils; publi

深入學習mysql表的操作

uniq order fault change incr 相關 約束 設置 type 1、表:是數據庫中的存儲數據的基本單位,一個表包含若幹個字段和值 2、創建表:   CREATE TABLE 表名稱 (   字段名1  數據庫類型1  [約束條件1],   字段名2  

[轉]Web APi認證Authentication兩種實現方式【十三

用戶數 ted das 客戶 元素 基礎 目標 開始 net 本文轉自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如

自動化運維saltstackstates介紹及使用

配置文件 如何 states master 根目錄 一、什麽是Salt States?Salt States是Salt模塊的擴展,主系統使用的狀態系統叫SLS系統,SLS代表Saltstack State,Salt是一些狀態文件,其中包含有關如何配置Salt子節點的信息,這些狀態被存放在一

Spring MVC 的 研發

eight 對象 files tin servlet映射 資源 研發 領域 延遲 二、web.xml的簡單配置介紹1 1、啟動Web項目時,容器回去讀web.xml配置文件裏的兩個節點<context-param>和<listener

開發筆記 Activity

nac 創建 intent nbsp star lda this 空白 空白頁 Activity -> Intent -> Activity startActivity(Intent) 創建Activity 步驟: 右擊->new

angular 4 實戰開發--兼容問題1

部門 方案 我們 是我 是不是 實戰 發現 版本 功能 首先我強調下我只是個菜鳥,大神不喜勿噴。 先介紹下項目背景,主要是公司的官網h5 ,架構用的是angular4 有點大材小用的趕腳,but ,公司要求。 在項目主功能做的差不多了。交給測試,這時候發現百度瀏覽器,u

Java面向對象編程繼承

抽象方法 oid 修飾 屬於 ... 方法的參數 要求 ring 覆蓋 在上一篇博客中,我們已經了解繼承的基本概念和語法,那麽今天我們就來聊一聊有關於繼承的其他東西。 讓我們來了解一下什麽是方法重載(overload)和方法覆蓋(override) 方法重載(overloa

SIPp常用腳本UAS

invite pcm option 響應 etime aud 服務器 esp contact 看名字就能猜出來,這是作為SIP消息服務端的存在,啟動uas,等著接受SIP消息並且給出響應。 一、uas.xml <?xml version="2.0" encoding

Java學習流程控制語句

循環 cas 學習之路 將不 乘法表 length 跳出循環 spa int if、if…else…語句 if (true) { System.out.println("為真時執行");

次元碼農的成長json到底有什麽用途

頁面 asc 語法 處理 交互 分隔 規則 stl 成長之路 寫的有問題請指出 一、什麽是json 1json指的是javaScript的表示方法 2JSON是輕量級的文本數據交換格式 3 Json是獨立語言 4 json具有自我描述性 更易理解 二、語法規則 1對

Hibernate框架一對多關系

true pre conn 關系 編寫 none isp exce dia 在下列案例中:   客戶是一;聯系人是多;客戶可以擁有多個聯系人;一個聯系人只有一個客戶   1、編寫實體類 package com.pojo; import java.util

Hibernate框架多對多多關系

-m let ble ssi gin rop assert on() odi 1、配置實體類 package cn.pojo; import java.util.HashSet; import java.util.Set; public class

基礎篇集合總結

線程不安全 emp abstract 和集 write next 不可變 叠代器 關系 1. Map集合和collection結合的區別 1》Collection一次存一個元素;Map一次存一對元素; 2》Collection是單列集合;Map是雙列集合; 3》Map中的存