PS:这一章节看的我有几分迷茫,不是很容易理解...不过还好总算是明白了一大半了...基本的迷惑是解决了...

学习内容:

1.跨应用启动服务...

2.跨应用绑定服务...

3.跨应用实现通信...

由于5.0版本之前和5.0版本之后是有很大的区别的,因此我都会在这里进行具体的介绍...

1.跨应用启动服务...

  跨应用启动服务,其实就是多个应用程序之间产生一种沟通关系,应用程序之间可以进行通信或者是完成一些其他的互动,总而言之,就是在我本身的应用程序中去启动其他应用程序的某个服务,这就完成了跨应用启动服务...

2.跨应用绑定服务...

  跨应用绑定服务和跨应用启动服务基本类似,就是跨应用实现了绑定,调用的函数不一样而已...在这里我就不进行粘贴代码了,因为没什么必要,仅仅是跨应用启动和绑定服务是没有任何意义的,因为应用之间只有实现了通信,那么跨应用才有必要,否则我光绑定或者只是启动服务,而无法完成通信,那就一点意义都没有了...因此重点还是下面这点...

3.跨应用实现通信...

  跨应用实现通信,这个东西是非常重要的,应用程序之间,难免是需要通信的...这里完成通信一般都是使用绑定服务来完成,也就是说,都是使用bindService()来完成的..在这里呢Android机制为我们提供了一个AIDL服务,来方便我们完成跨进程通信,那么什么是AIDL呢,就是Android接口语言..它用来公开服务的接口,然后是其他的应用程序也可以访问这个应用程序内部的服务..是个非常猛的机制...那么如何去使用呢...

  在这里我建立两个应用程序,一个是服务端,一个是客户端...服务端用来提供数据,客户端用来获取数据...

i.首先我们先建立一个服务端...

  新建一个项目..exam_Cilent,包名为org.hnist.demo。。然后点击包文件,New->File,然后会弹出窗口,在最下方输入IPerson.aidl。。直接Finish就行了...然后编辑我们的aidl文件..

package org.hinst.demo;
interface IPerson{void setName(String name);void setAge(int age);void setEmail(String email);String display();
} 

在正常情况下在R.java文件下会自动生成一个IPerson.java文件...这个需要一点点时间...如果实在是没生成,那就Rebuild project...然后就搞定了...

  然后再建立一个IPersonImp.java文件,这个文件需要继承IPerson.Stub类,这里是核心部分...想必大家都明白,我们定义了一个接口,必然需要有一个类去实现这个接口..这个类才是真正能被客户端调用的东西..

package org.hinst.demo;import android.os.RemoteException;public class IPersonImpl extends IPerson.Stub{private String name="ClearLove";private int age=20;private String email="zxf@163.com";@Overridepublic void setName(String name) throws RemoteException {// TODO Auto-generated method stubthis.name=name;}@Overridepublic void setAge(int age) throws RemoteException {// TODO Auto-generated method stubthis.age=age;}@Overridepublic void setEmail(String email) throws RemoteException {// TODO Auto-generated method stubthis.email=email;}@Overridepublic String display() throws RemoteException {// TODO Auto-generated method stubreturn "姓名:"+name+"年龄"+age+"邮箱"+email;}}

服务端的MainActivity.java文件保持原样就行...什么东西都不加也可以...也可以自己定义一些代码调用服务..

  最后我们需要在AndroidManifest.xml文件中进行一些相应的配置...这个文件是必须要进行配置的,否则就会出现问题...只需要在</activity>和</application>之间加入下列代码就完成了...这个在5.0版本之前都是允许的,但是在5.0版本以后是不允许再这样做的...

<service android:name="MyRemoteService"><intent-filter><action android:name="org.hinst.demo.MyRemoteService"/></intent-filter></service>

 ii.这样服务端我们就配置完了...接下来就是客户端了...客户端相对就很简单....只是注意一点细节就可以了...我们再次建立另一个项目...包名为org.exam...然后再新建一个包..这个包用来存放...服务端的aidl文件...包名要和客户端保存的adil文件的包名相同,就是org.hnist.demo...然后再次新建一个aidl文件,输入的内容与服务端的一样...完成后,在客户端的R.java文件也会生成一个文件...这样客户端的aidl就配置好了...

然后就是客户端进行调用了...在MainActivity中进行调用...

package org.hnist.exam;import org.hinst.demo.IPerson;import com.example.exam6_7client.R;import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;public class MainActivity extends Activity implements View.OnClickListener {private IPerson iPerson;private TextView textview;Intent intent=new Intent("org.hinst.demo.MyRemoteService");private ServiceConnection con=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubiPerson=null;}@Overridesynchronized public void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubiPerson=IPerson.Stub.asInterface(service);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.start).setOnClickListener(this);bindService(intent, con, Service.BIND_AUTO_CREATE);textview=(TextView) findViewById(R.id.show);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch(v.getId()){case R.id.start:try {iPerson.setName("Clearlove");String msg=iPerson.display();MainActivity.this.textview.setText(msg);} catch (RemoteException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}protected void onDestroy(){unbindService(con);super.onDestroy();}}

  布局文件我就不进行粘贴了....我们先启动服务端完成相应的aidl文件的配置,然后调用客户端,这样在触发按钮的时候,客户端就会输出服务端的信息了...这样也就完成了客户端与服务端的通信...

  在5.0版本以后呢,我们就不能使用配置AndroidManifest.xml文件,使用隐式的Intent已经无法完成多个应用程序之间的通信了...5.0版本之后..aidl文件的配置是一样的,没有任何的变化,唯一的变化就是需要使用显式的Intent,去进行传递...这个的原因我还真就不是很清楚...

  如何传递呢?就是这样...

serviceintent =new Intent();
serviceintent.setComponent(new ComponentName("com.example.myserviceapp","com.example.myserviceapp.AppMyService"));

  只要把Intent建立的对象制定一个主键值,这个主键值有两个参数,一个是我们要调用的服务的包名,一个是这个服务名....然后这样就完成了主键值的赋值....然后再次使用bindservice(serviceintent,this,Server.BIND_AUTO_CREATE)方法在进行传递...就完成了...最后放一个完整的代码,方便大家理解...这里使用了一个打包的机制..大家不用弄懂..关键是看服务端与客户端的实现...其实我上面的代码也是可以运行的...上面的更加的简单...

  这个跨进程通信不是很好理解,实际上并不难,只要理解了就会发现,其实没什么难的东西...关键还是看自己是否用心研究...

这个是服务端的代码...

http://files.cnblogs.com/files/RGogoing/AIDLService.rar

这个是客户端...

http://files.cnblogs.com/files/RGogoing/AIDLClient.rar

 

转载于:https://www.cnblogs.com/RGogoing/p/4554799.html

Android 学习笔记 Service服务与远程通信...(AIDL)相关推荐

  1. Android学习笔记-Service

    * 1.Service是一个应用程序组件 * 2.Service没有图形化界面 * 3.Service通常用来处理一些耗时比较长的操作 * 4.可以使用Service更新ContentProvider ...

  2. android学习笔记---42_服务的生命周期

    42_服务的生命周期 ------------------------- 与采用Context.startService()方法启动服务有关的生命周期方法 onCreate() onStart() ...

  3. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  4. Pro Android学习笔记(七七):服务(2):Local Service

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Local Service的目的是更容易实 ...

  5. Android学习笔记第五篇--网络连接与云服务(一)

    Android学习笔记第五篇–网络连接与云服务 第一章.无线连接设备 ​ 除了能够在云端通讯,Android的无线API也允许在同一局域网内的设备通讯,**甚至没有连接网络,而是物理具体相近,也可以相 ...

  6. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)

    Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它 ...

  7. Android学习笔记(七):多个Activity和Intent

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

  8. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  9. Linux学习笔记 文件服务Vsftp详细介绍

    Linux学习笔记 文件服务Vsftp详细介绍 知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据 ...

最新文章

  1. Redisbook学习笔记(1)跳跃表
  2. Android UI -- 布局介绍(布局包括FrameLayout, LinearLayout, RelativeLayout, GridLayout)
  3. AI知识图谱,让我撸到了一只「天山上的雪豹」
  4. 三星note4安装linux,Leanote Ubuntu 源码安装
  5. 开盘即破发,网易有道赴美上市,继续发力在线教育
  6. 月活675万 三翼鸟以三大能力“重建”行业赛道
  7. Hash冲突处理终极版
  8. Java中的命令设计模式
  9. 关于用display:table让元素居中的小结
  10. 【CodeForces - 349B】Color the Fence (贪心,填数)
  11. 监控linux终端键盘输入,Linux内核实时监控键盘输入
  12. cesium之地图显示坐标、比例尺、海拔高度效果篇
  13. 设计模式之GOF23外观模式
  14. 【CF1324E】Sleeping Schedule(dp)
  15. linux c实现通用hash表
  16. Qt练习项目--鼠标连点器
  17. mysql uroot pg t_【原创】MySQL和PostgreSQL 导入数据对比
  18. appid+openid(微信小程序)
  19. 数据库用户配额问题ORA-01536: space quota exceeded for tablespace 'TFR_DATA' #
  20. 图片:“给你五十行代码把我变成字符画!” 程序:“太多了,一半都用不完!”

热门文章

  1. 对方删了你的微信,你列表依然有ta的存在,该不该也把ta删掉?
  2. 创业者总认为自己能力很强,但能力之上是认知力
  3. 对创业者来说,创业心学就是一个不断提升自己
  4. 耍小聪明的人,永远不可能取得自己事业的成功
  5. 双频路由器是选择将2.4G和5.0G分设,还是选择由机器选择好?
  6. At present, Huawei has two more important
  7. 分布式系统领域经典论文翻译集
  8. Android数据存储——内部存储
  9. c# mysql数据集_C#第四次作业:MySQL数据库及C#操作MySQL数据库
  10. sql示例_操作员之间SQL概述和示例