美文网首页
Android SDK封装,对外提供接口

Android SDK封装,对外提供接口

作者: 杰子他爸 | 来源:发表于2019-05-29 15:37 被阅读0次

    项目中需要把连接服务器的部分做成一个service并生成一个jar模块。其他产品就可通过这个包来快速的开发连接服务器的应用软件。做成一个service的优点是:

    1. 在后台运行,可以一直保持与服务器的连接

    2. 服务可以只对外提供接口,具体功能在服务内部实现

    3. 增加项目代码的耦合性

    打开几个我使用的第三方sdk的jar包看看:

    这是微信的语音识别sdk的jar包的内容

    我们一般开发一个sdk当然是定义远程的service,也就是通过bingservice启动的方式来启动的服务。

    同时,应用和服务通信的方式有Messenger和aidl,具体区别看别人的文章吧。

    我们这里是开发一个sdk,因此选择了使用aidl,当然如果你的sdk并不包含任何服务,就没有这回事儿了。

    现在以一个例子描述创建一个服务并调用的过程。例子的功能是设置一个数字的值到服务里,然后在从服务里读出来。主界面用于放置了两个按键用于触发以上两个动作,调用的结果在logcat里显示。

    首先创建一个工程,,然后在项目src下面创建一个包,用于放置服务的代码以及一个包用于放置aidl文件。包内依次放置了服务类和aidl文件。创建完之后,内容如下。

    其中CloudServiceInterface.aidl文件内容如下:

    packagecom.rayleigh.aidl;

    interfaceCloudServiceInterface {

       void setInfo(intperson);

       int  getInfo();

    }

    CloudService.java文件文件内容如下:

    packagecom.rayleigh.cloud;

    importcom.rayleigh.aidl.CloudServiceInterface;

    import android.app.Service;

    importandroid.content.Intent;

    importandroid.os.IBinder;

    importandroid.util.Log;

    publicclass CloudService extends Service {

           private int testdata = 0;

        public CloudService() {

        }

        private static final StringTAG="Test";

        @Override

        public void onCreate()

        {

            Log.i(TAG, "ServiceonCreate--->");

            //TODO:register broadcast

            //// TODO: 2016/12/18  or start do something

            super.onCreate();

        }

        @Override

        public int onStartCommand(Intent intent,int flags, int startId) {

           // return super.onStartCommand(intent,flags, startId);

            return START_STICKY;

        }

        @Override

        public void onDestroy()

        {

            Log.i(TAG, "ServiceonDestroy--->");

            //TODO: unregister broadcast

            super.onDestroy();

        }

        @Override

        public boolean onUnbind(Intent intent) {

            Log.i(TAG, "Serviceonunbind--->");

            return super.onUnbind(intent);

        }

        @Override

        public void onRebind(Intent intent) {

            Log.i(TAG, "Serviceonrebond--->");

            super.onRebind(intent);

        }

       @Override

        public IBinder onBind(Intent intent) {

            // TODO: Return the communicationchannel to the service.

           // throw new UnsupportedOperationException("Notyet implemented");

            return mBinder;

        }

        private final CloudServiceInterface.StubmBinder = new CloudServiceInterface.Stub() {

            @Override

            public void setInfo(int person)  {

                testdata = person;

            }

            @Override

            public int getInfo()   {

                return testdata;

            }

        };

    }

    然后点击project->clean,来编译项目。就会在gen目录里生成了CloudServiceInterface.aidl所用对应的CloudServiceInterface.java。如下:

    然后在AndroidMannifest.xml里面添加服务声明:

    <service

                android:name="com.rayleigh.cloud.CloudService"

                android:process=":remote"

                >

                <intent-filter >

                    <action

                        android:name="com.rayleigh.cloud.CloudService"/>

                </intent-filter>

            </service>

    然后在MainActivity.java里面定义服务对象:

    CloudServiceInterfacemService;

        private ServiceConnectionserviceConnection =new ServiceConnection() {

            @Override

            publicvoid onServiceConnected(ComponentName componentName,IBinder iBinder) {

               Log.e("on","on service connected");

               mService = CloudServiceInterface.Stub.asInterface(iBinder);

            }

            @Override

            publicvoid onServiceDisconnected(ComponentName componentName) {

               Log.e("on","on service disconnected");

               mService = null;

            }

    };

    然后调用bindService函数启用服务。我定义成函数如下:

    private void connectionToService() {

             Intent intent=newIntent(MainActivity.this,CloudService.class);

             this.getApplicationContext().bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);

      }

    在onCreate里面调用此函数。

    最后onCreate里面的内容如下:

        @Override

        protected void onCreate(BundlesavedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            startBtn = (Button)findViewById(R.id.StartBtn);

            stopBtn = (Button) findViewById(R.id.StopBtn);

            startBtn.setOnClickListener(listener);

            stopBtn.setOnClickListener(listener);

            connectionToService();

    }

    其中按键点击响应函数如下:

    private View.OnClickListener listener = newView.OnClickListener()

        {

            @Override

            public void onClick(Viewv)

            {

                switch (v.getId())

                {

                    case R.id.StartBtn:

                        if (mService != null){

                            try {

                               mService.setInfo(3);

                                Log.e("mainactivity","setvalue success");

                            } catch (Exceptione){

                            }

                        } else {

                            Log.e("mainactivity","mServiceis null");

                        }

                        break;

                    case R.id.StopBtn:

                        if (mService != null){

                            try {

                                int a= mService.getInfo();

                                Log.e("mainactivity","getvalue is :"+ a);

                            } catch (Exceptione) {

                            }

                        } else {

                            Log.e("mainactivity","mServiceis null");

                       }

                        break;

                    default:

                        break;

                }

            }

        };

    分别点击两个按键来,设置数字到服务里,和从服务里获取数据

    这个例子很简单,看代码就可以了

    相关文章

      网友评论

          本文标题:Android SDK封装,对外提供接口

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