如何用Android Service通过aidl传递一个数据流

 我来答
huanglenzhi
推荐于2016-08-10 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517201
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

  第一步:部署我们的服务端,也就是Service端:

  1:在Service端我先自定义2个类型:Person和Pet。因为我们需要跨进程传递Person对象和Pet对象,所以Person类和Pet类都必须实现Parcelable接口,并要求在实现类中定义一个名为CREATER,类型为Parcelable.creator的静态Field。

  代码如下:

  

 

  

  这是我Service端的部署情况(其中MainActivity可以不用去实现,因为我们只提供服务,没有窗口显示):

  第二步:部署客户端:

  1.在客户端新建一个包,命名需要和服务端放置aidl文件的包名相同(我这里是com.example.remoteservice),然后把服务端的Person.java,Pet.java,Person.aidl,Pet.aidl,IPet.aidl复制到这个包下面

  

  2.在activity中绑定远程服务进行数据交换,layout布局和activity代码如下:

  

  1 <RELATIVELAYOUT xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:context="com.example.remoteclient.RemoteClient" android:paddingtop="@dimen/activity_vertical_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingbottom="@dimen/activity_vertical_margin" android:layout_width="match_parent" android:layout_height="match_parent" 9="" 8="" 7="" 6="" 5="" 4="" 3="" 2="">

  10

  11     <LINEARLAYOUT android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" 14="" 13="" 12="">

  15

  16         <LINEARLAYOUT android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" 19="" 18="" 17="">

  20

  21             <EDITTEXT android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom" android:id="@+id/editText_person" android:ems="10" 26="" 25="" 24="" 23="" 22="">

  27             </EDITTEXT>

  28

  29<BUTTON type=submit android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom" android:id="@+id/button_ok" android:text="确定" 34="" 33="" 32="" 31="" 30="">

  35

  36

  37         <LISTVIEW android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listView_pet" 40="" 39="" 38="">

  41         </LISTVIEW>

  42

  43

  44</BUTTON></LINEARLAYOUT></LINEARLAYOUT></RELATIVELAYOUT>

  


  

  1 package com.example.remoteclient;

  2

  3 import android.app.Service;

  4 import android.content.ComponentName;

  5 import android.content.Intent;

  6 import android.content.ServiceConnection;

  7 import android.os.Bundle;

  8 import android.os.IBinder;

  9 import android.os.RemoteException;

  10 import android.support.v7.app.ActionBarActivity;

  11 import android.util.Log;

  12 import android.view.View;

  13 import android.view.View.OnClickListener;

  14 import android.widget.ArrayAdapter;

  15 import android.widget.Button;

  16 import android.widget.EditText;

  17 import android.widget.ListView;

  18

  19 import com.example.remoteservice.IPet;

  20 import com.example.remoteservice.Person;

  21 import com.example.remoteservice.Pet;

  22

  23 import java.util.List;

  24

  25 public class RemoteClient extends ActionBarActivity {

  26

  27     public static final String REMOTE_SERVICE_ACTION = com.example.remoteservice.RemoteService.ACTION;

  28     EditText editText;

  29     Button button;

  30     ListView listView;

  31

  32     IPet petService;// 声明IPet接口

  33     List<PET> pets;

  34     ServiceConnection conn = new ServiceConnection() {

  35

  36         @Override

  37         public void onServiceDisconnected(ComponentName name) {

  38             Log.i(csx, onServiceDisconnected);

  39             conn = null;

  40         }

  41

  42         @Override

  43         public void onServiceConnected(ComponentName name, IBinder service) {

  44             Log.i(csx, onServiceConnected);

  45             petService = IPet.Stub.asInterface(service);// 通过远程服务的Binder实现接口

  46

  47         }

  48     };

  49

  50     @Override

  51     protected void onCreate(Bundle savedInstanceState) {

  52         super.onCreate(savedInstanceState);

  53         setContentView(R.layout.remote_client_layout);

  54         editText = (EditText) findViewById(R.id.editText_person);

  55         button = (Button) findViewById(R.id.button_ok);

  56         listView = (ListView) findViewById(R.id.listView_pet);

  57

  58         Intent service = new Intent();

  59         service.setAction(REMOTE_SERVICE_ACTION);

  60

  61         bindService(service, conn, Service.BIND_AUTO_CREATE);// 绑定远程服务

  62

  63         button.setOnClickListener(new OnClickListener() {

  64

  65             @Override

  66             public void onClick(View v) {

  67                 String personName = editText.getText().toString();

  68                 if (personName == null || personName.equals()) {

  69

  70                     return;

  71                 }

  72

  73                 try {

  74                     pets = petService.getPets(new Person(1, personName, personName));// 调用远程service的getPets方法

  75                     updataListView();

  76

  77                 } catch (RemoteException e) {

  78

  79                     e.printStackTrace();

  80                 } catch (NullPointerException e) {

  81                     e.printStackTrace();

  82                 }

  83

  84             }

  85         });

  86

  87     }

  88

  89     public void updataListView() {

  90         listView.setAdapter(null);

  91

  92         if (pets == null || pets.isEmpty()) {

  93             return;

  94

  95         }

  96         ArrayAdapter<PET> adapter = new ArrayAdapter<PET>(RemoteClient.this,

  97                 android.R.layout.simple_list_item_1, pets);

  98         listView.setAdapter(adapter);

  99

  100     }

  101

  102     @Override

  103     protected void onDestroy() {

  104

  105         unbindService(conn);// 解除绑定

  106         super.onDestroy();

  107     }

  108

  109 }</PET></PET></PET>

  

  到此为止所有的工作都完成了,下面我们看一下效果:我在编辑框中输入“csx”,点击确定,就会显示出服务端RemoteService中pets的相应数据。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式