当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

4.2.3 Service精通

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:26:15

num) { if(num > 0 && num < 6){ return names[num - 1]; } return null; } @Override public IBinder onBind(Intent intent) { return null; } private final class PersonQueryBinder extends Stub{ @Override public String queryPerson(int num) throws RemoteException { return query(num); } }}Step 3:在AndroidManifest.xml文件中注册Service<service android:name=".AIDLService"> <intent-filter> <action android:name="android.intent.action.AIDLService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>这里我们并没有提供Activity界面,但是改应用提供的Service可以供其他app来调用!2.客户端 直接把服务端的那个aidl文件复制过来,然后我们直接在MainActivity中完成,和绑定本地Service的操作 有点类似,流程如下: 1)自定义PersonConnection类实现ServiceConnection接口 2)以PersonConnection对象作为参数,调用bindService绑定远程Service bindService(service,conn,BIND_AUTO_CREATE); ps:第三个参数是设置如果服务没有启动的话,自动创建 3)和本地Service不同,绑定远程Service的ServiceConnection并不能直接获取Service的onBind( )方法 返回的IBinder对象,只能返回onBind( )方法所返回的代理对象,需要做如下处理: iPerson = IPerson.Stub.asInterface(service); 再接着完成初始化,以及按钮事件等就可以了具体代码如下:MainActivity.javapackage com.jay.aidlclient;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.jay.aidl.IPerson;public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private EditText edit_num; private Button btn_query; private TextView txt_name; private IPerson iPerson; private PersonConnection conn = new PersonConnection(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); //绑定远程Service Intent service = new Intent("android.intent.action.AIDLService"); service.setPackage("com.jay.aidlserver"); bindService(service, conn, BIND_AUTO_CREATE); btn_query.setOnClickListener(this); } private void bindViews() { edit_num = (EditText) findViewById(R.id.edit_num); btn_query = (Button) findViewById(R.id.btn_query); txt_name = (TextView) findViewById(R.id.txt_name); } @Override public void onClick(View v) { String number = edit_num.getText().toString(); int num = Integer.valueOf(number); try { txt_name.setText(iPerson.queryPerson(num)); } catch (RemoteException e) { e.printStackTrace(); } edit_num.setText(""); } private final class PersonConnection implements ServiceConnection { public void onServiceConnected(ComponentName name, IBinder service) { iPerson = IPerson.Stub.asInterface(service); } public void onServiceDisconnected(ComponentName name) { iPerson = null; } }}接下来先启动AIDLServivce,然后再启动AIDLClient,输入查询序号,即可获得对应姓名!当然也可以直接启动AIDLClient,也会获得同样效果:效果图如下:3)传递复杂数据的AIDL Service上面的例子我们传递的只是要给int类型的参数,然后服务端返回一个String类型的参数,看似满足我们的基本需求,不过实际开发中,我们可能需要考虑传递复杂数据类型的情况!下面我们来学习下如何向服务端传递复杂数据类型的数据!开始之前我们先来了解Parcelable接口!——Parcelable接口简介:相信用过序列化的基本上都知道这个接口了,除了他还有另外一个Serializable,同样是用于序列化的,只是Parcelable更加轻量级,速度更快!但是写起来就有点麻烦了,当然如果你用的as的话可以用的插件来完成序列化,比如:Android Parcelable Code Generator当然,这里我们还是手把手教大家来实现这个接口~首先需要实现:writeToParcel和readFromPacel方法写入方法将对象写入到包裹(parcel)中,而读取方法则从包裹中读取对象,请注意,写入属性顺序需与读取顺序相同接着需要在:该类中添加一个名为CREATOR的static final属性改属性需要实现:android.os.Parcelable.Creator接口再接着需要从写接口中的两个方法:createFromParcel(Parcel source)方法:实现从source创建出JavaBean实例的功能newArray(int size):创建一个类型为T,长度为size的数组,只有一个简单的return new T[size]; (这里的T是Person类)最后,describeContents():这个我也不知道是拿来干嘛的,直接返回0即可!不用理他——另外,非原始类型中,除了String和CharSequence以外,其余均需要一个方向指示符。方向指示符包括in、out、和inout。in表示由客户端设置,out表示由服务端设置,inout表示客户端和服务端都设置了该值。好的,接着来写代码试试(AS这里自定义类型有点问题,暂时还没解决,就用回Eclipse~):代码示例:自定义两种对象类型:Person与Salary,Person作为调用远程的Service的参数,Salary作为返回值!那么首先要做的就是创建Person与Salary类,同时需要实现Parcelable接口1.——服务端

上一页  [1] [2] [3] [4] [5] [6]  下一页


4.2.3 Service精通