Android SDK封装,对外提供接口

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

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

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

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

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

2968974-f64527fbc8ce236b
2968974-e0721d4d2d9b7d0e

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

2968974-0ae956af618ad6b9

我们一般开发一个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;

            }

        }

    };


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

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

转载于:https://www.jianshu.com/p/934246808bc6

猜你喜欢

转载自blog.csdn.net/weixin_33690963/article/details/91114992