service(二) Android Studio 编写远程服务

本文参考于 http://android.blog.51cto.com/268543/537684/

相信eclipse中大家  对远程服务都有一定的了解 。这里我在网上找了点资料,并尝试了下 在Android studio中编写远程服务。

 网上有两种做法,这里我只用了一种:

   首先切换到project目录下,在main文件夹下创建文件 aidl,然后在aidl创建包名(Manifest中的包名),再在这个包里创建我们的服务IMyService.aidl。编译一下,在build/generated/source/aidl/debug/包名,在包名下面就可以发现studio为我们生成的文件。

下面是我的服务文件:

package com.example.xiao8.myapplication;

interface IMyService{
   void savePersonInfo(int personId);

}

 AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。
    其中对于Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map,不需要import 语句。
    而如果需要在AIDL中使用其他AIDL接口类型,需要import,即使是在相同包结构下。AIDL允许传递实现Parcelable接口的类,需要import.
    需要特别注意的是, 对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。
    AIDL只支持接口方法,不能公开static变量。
(这里摘一下大神写的东西,希望大神能够原谅我)
我这里只写了个简单的int类型,如果需要复杂的类型的话参考 http://android.blog.51cto.com/268543/537684/

下面我们写下远程服务的具体类:
public class RemoteService extends Service {
    public IBinder onBind(Intent intent) {
        Log.d("ljy","----server----接收到的数据----->"+intent.getStringExtra("msg"));
        return mBinder;
    }

    private final IMyService.Stub mBinder = new IMyService.Stub() {
        @Override
        public void savePersonInfo(int personId) throws RemoteException {
            Log.d("ljy", "-----personId------->" + personId);
        }
    };
}
这里我们 new一个studio帮我们生成的对象IMyService.Stub,并在onBind中返回。和本地服务相似,只是Bind换成了Stub。

下面写客户端:
同样执行下 服务器端aidl文件的创建:
首先切换到project目录下,在main文件夹下创建文件 aidl,然后在aidl创建包名(Manifest中的包名),再在这个包里创建我们的服务IMyService.aidl。编译一下,在build/generated/source/aidl/debug/包名,在包名下面就可以发现studio为我们生成的文件。
然后写下客户端的代码,这里和本地服务是相似的,只是获取服务的方法换成了IMyService.Stub.asInterface
public class MainActivity extends AppCompatActivity {

    private IMyService mRemoteService;
    private ServiceConnection mRemoteConnection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRemoteConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                mRemoteService = IMyService.Stub.asInterface(service); //获取远程服务
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
    }

    public void doClick(View v){
        Intent intent = new Intent("remoteService");
        intent.putExtra("msg", "data");

        switch (v.getId()){
            case R.id.bind:
                bindService(intent,mRemoteConnection, BIND_AUTO_CREATE);
                break;
            case R.id.unbind:
                unbindService(mRemoteConnection);
                break;
            case R.id.set_data:
                if(null!=mRemoteService){
                    try {
                        mRemoteService.savePersonInfo(10);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
    }
}






你可能感兴趣的:(Android,service,AndroidStudio,远程服务,四大组件)