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();
        }
    }
     
     

    运行结果截图:

  • 相关阅读:
    NTP on FreeBSD 12.1
    Set proxy server on FreeBSD 12.1
    win32 disk imager使用后u盘容量恢复
    How to install Google Chrome Browser on Kali Linux
    Set NTP Service and timezone on Kali Linux
    Set static IP address and DNS on FreeBSD
    github博客标题显示不了可能是标题包含 特殊符号比如 : (冒号)
    server certificate verification failed. CAfile: none CRLfile: none
    删除文件和目录(彻底的)
    如何在Curl中使用Socks5代理
  • 原文地址:https://www.cnblogs.com/zhangming-blog/p/5272487.html
Copyright © 2011-2022 走看看