美文网首页
AIDL实例

AIDL实例

作者: xlq | 来源:发表于2017-08-21 16:27 被阅读0次

几句话:
1.此实例实际上就是一个求和计算器;
2.客户端是位于前台的Activity,用于数据的输入输出;
3.服务器端是在后台的Service,用于数据的计算;
4.两者处于不同的进程中,通过AIDL进行数据交流。

开始code:
1.首先创建AIDL:
在Android Studio的app层右键新建AIDL文件,命名为:ICalculate,此时会自动生成aidl的包,包中有ICalculate.aidl文件。代码如下:

// ICalculate.aidl
package com.example.ubuntu.aidlcalculatedemo;

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

interface ICalculate {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
   double doCalculate(double a,double b);
}

代码很简单,定义了一个方法doCalculate(double a , double b)。

  1. 创建后台Service:
    主要代码是重写doCalculate方法,并返回一个Binder对象给调用者,代码如下:
package com.example.ubuntu.aidlcalculatedemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class CalculateService extends Service {

    private ICalculate.Stub mBinder = new ICalculate.Stub() {
        @Override
        public double doCalculate(double a, double b) throws RemoteException {
            double result = a + b;
            return result;
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}
  1. 主Activity的业务逻辑:
    绑定服务,获取到Binder对象,通过该对象来调用AIDL的方法doCalculate。代码如下:
package com.example.ubuntu.aidlcalculatedemo;

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

public class MainActivity extends AppCompatActivity {

    private EditText num1, num2;
    private TextView resultText;
    private Button calculate;
    private ICalculate iCalculate;

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iCalculate = ICalculate.Stub.asInterface(service);
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
            iCalculate = null;
        }
    };

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

        num1 = (EditText) findViewById(R.id.num1);
        num2 = (EditText) findViewById(R.id.num2);
        resultText = (TextView) findViewById(R.id.result_text);
        calculate = (Button) findViewById(R.id.result);

        Intent intent = new Intent(MainActivity.this, CalculateService.class);
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);

        calculate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击button,隐藏软键盘
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

                double a = Double.parseDouble(num1.getText().toString());
                double b = Double.parseDouble(num2.getText().toString());
                try {
                    double result = iCalculate.doCalculate(a, b);//调用接口
                    resultText.setText("计算结果:" + result);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(serviceConnection);
    }
}

最后,Manifest.xml文件中按如下配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ubuntu.aidlcalculatedemo" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".CalculateService"
            android:process=":service"/><!-- 将service放到新的进程中-->
    </application>

</manifest>

这样我们就完成了跨进程调用,收工!效果图如下:

Screenshot_20170821-160126.png

相关文章

  • AIDL实例

    说到进程间通信,一般首先就会想到AIDL,也看了很多文章,做下笔记,记录一下,方便以后查阅。 对于 AIDL 我...

  • AIDL实例

    几句话:1.此实例实际上就是一个求和计算器;2.客户端是位于前台的Activity,用于数据的输入输出;3.服务器...

  • 每天五道Android面试题,轻松进大厂2018-12-21

    一、AIDL理解 此处延伸:简述Binder AIDL: 每一个进程都有自己的Dalvik VM实例,都有自己的一...

  • Android AIDL简单实例

    这篇文章就只是简单讲解以下AIDL的使用,如果需要详细的文档说明之类的请自行百度,Google【手动滑稽】 新建两...

  • IPC相关

    Android权限之sharedUserId、签名(实例说明) Android 中AIDL的使用与理解 Binde...

  • AIDL使用总结

    服务端进程: 1:创建AIDL文件如xxx.aidl 2:在接口中自定义方法,如果有bean则实例化改bean实体...

  • AIDL实例,双向通信

    服务端实现 接下来的过程演示了服务端怎么实现Android复杂的AIDL通信实例首先需要明白的一个事情,调用一个方...

  • 【Android实例】AIDL简单使用

    概述 什么是AIDL? Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通...

  • IPC(二)--AIDL使用实例

    移步Android跨进程通信IPC 使用流程 1.将想要进程间传递的对象序列化2.创建.aidl文件,并在文件内声...

  • Android Studio使用AIDL-实现进程间通讯

    参考: Android Studio创建AIDL文件并实现进程间通讯实例如何在AndroidStudio中使用AI...

网友评论

      本文标题:AIDL实例

      本文链接:https://www.haomeiwen.com/subject/smthdxtx.html