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

    运行结果截图:

  • 相关阅读:
    new JSONObject()报空指针异常
    转:修改Fckeditor 2.6 增加插入Mp3等多媒体文件功能
    执行更新操作时,timestamp类型的字段自动被更新为了系统当前日期
    读取某个文件的位置
    myeclipse配置注释
    为eclipse 的 hibernate 配置文件加提示
    hibernate3与hibernate4
    查看eclipse版本
    Eclipse编译没有class文件生成
    严重: Error loading WebappClassLoader context:
  • 原文地址:https://www.cnblogs.com/zhangming-blog/p/5272487.html
Copyright © 2011-2022 走看看