zoukankan      html  css  js  c++  java
  • Android中利用AIDL机制调用远程服务

    服务端:
    
    //CalculateInterface.aidl
    package com.itheima.aidl.calculate;
    
    interface CalculateInterface {
    double doCalculate(double a, double b);
    }
    
    
    
    //CalculateService.java
    package com.itheima.myaidl.server;
    
    import com.itheima.aidl.calculate.CalculateInterface;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.os.RemoteException;
    import android.util.Log;
    
    public class CalculateService extends Service{
    private final CalculateInterface.Stub mBinder = new CalculateInterface.Stub() {
    @Override
    public double doCalculate(double a, double b) throws RemoteException {
    return a+b;
    }
    };
    
    @Override
    public IBinder onBind(Intent intent) {
    Log.i("test","onBind...");
    return mBinder;
    }
    
    @Override
    public boolean onUnbind(Intent intent) {
    Log.i("test","onUnbind...");
    return super.onUnbind(intent);
    }
    
    @Override
    public void onCreate() {
    super.onCreate();
    Log.i("test","onCreate...");
    }
    
    @Override
    public void onDestroy() {
    super.onDestroy();
    Log.i("test","onDestroy...");
    }
    }
    
    //服务端manifast文件
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.itheima.myaidl.server"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="19" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity 
                android:name="com.itheima.myaidl.server.MainActivity"
                android:configChanges="locale|layoutDirection"
                android:theme="@android:style/Theme.Light.NoTitleBar"
                android:screenOrientation="portrait">
                 <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service android:name="com.itheima.myaidl.server.CalculateService">
                 <intent-filter>
                    <action android:name="com.itheima.myaidl.server.CalculateService" />
                </intent-filter>
            </service>
        </application>
    
    </manifest>
    
    
    //客户端
    //MainActivity.java
    
    package com.itheima.myaidl.client;
    
    import android.app.Activity;
    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.util.Log;
    
    import com.itheima.aidl.calculate.CalculateInterface;
    
    public class MainActivity extends Activity {
        private CalculateInterface mService;
        
        private ServiceConnection mServiceConnection = new ServiceConnection() {
            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.i("test","service disconnected...");
                mService = null;
            }
            
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.i("test","service connected...");
                mService = CalculateInterface.Stub.asInterface(service);  //获取接口实例
            }
        };
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //绑定远程服务
            Bundle bundle = new Bundle();
            Intent intent = new Intent();
            intent.putExtras(bundle);
            intent.setAction("com.itheima.myaidl.server.CalculateService");
            bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
        }
        
        //TODO activity加载完毕时回调此方法
        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            if(hasFocus){
                try{
                    double result = mService.doCalculate(1, 2);
                    Log.i("test","result===>"+result);
                }catch(RemoteException e){
                    e.printStackTrace();
                }
            }
            super.onWindowFocusChanged(hasFocus);
        }
        
        @Override
        protected void onDestroy() {
            unbindService(mServiceConnection);  //解绑远程服务
            super.onDestroy();
        }
    }
     
     

    运行结果截图:

  • 相关阅读:
    【Linux】Linux多个关机命令详解
    【树莓派】树莓派(Debian)- root用户无法使用SSH登录
    【树莓派】树莓派3B安装宝塔面板并配置安装LNMP
    class4/class10/UHS-1/UHS-3 SD卡速度等级区别
    electron-h5-网络状态检测
    electron-消息对话框
    electron-上传文件、保存文件
    electron-子窗口与父窗口通信
    electron-打包
    BrowserView-嵌入网页、open打开子窗口
  • 原文地址:https://www.cnblogs.com/zhangming-blog/p/5272487.html
Copyright © 2011-2022 走看看