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";
@Override
public void setName(String name) throws RemoteException {
// TODO Auto-generated method stub
this.name=name;
} @Override
public void setAge(int age) throws RemoteException {
// TODO Auto-generated method stub
this.age=age;
} @Override
public void setEmail(String email) throws RemoteException {
// TODO Auto-generated method stub
this.email=email;
} @Override
public String display() throws RemoteException {
// TODO Auto-generated method stub
return "姓名:"+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() { @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
iPerson=null;
} @Override
synchronized public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
iPerson=IPerson.Stub.asInterface(service);
}
};
@Override
protected 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);
} @Override
public 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;
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(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

 

Android 学习笔记 Service服务与远程通信...(AIDL)的更多相关文章

  1. android学习笔记 Service

    Service(服务): 长期后台运行的没有界面的组件 android应用什么地方需要用到服务? 天气预报:后台的连接服务器的逻辑,每隔一段时间获取最新的天气信息.股票显示:后台的连接服务器的逻辑,每 ...

  2. Android学习笔记_23_服务Service之AIDL和远程服务实现进程通信以及进程间传递自定义类型参数

    一.了解AIDL语言: 在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Java中是不支持跨进程内存共享的.因此要传递对象, 需要把对象解析 ...

  3. Android学习笔记_22_服务Service应用之—与Activity进行相互通信的本地服务

    一.启动服务的两种方法方法: 第一种:  startService()和stopService()启动关闭服务.适用于服务和Activity之间没有调用交互的情况.如果相互之间需要方法调用或者传递参数 ...

  4. Android 学习笔记 Service

    PS:前几篇的内容光是上代码了,也没有细细的讲解..感觉这样写很不好..因此还是多一些讲解吧... 学习内容: 1.了解Service... 2.Service的启动与停止.. 3.绑定与取消绑定Se ...

  5. 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

    目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...

  6. 【转】 Pro Android学习笔记(七七):服务(2):Local Service

    目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...

  7. 【转】 Pro Android学习笔记(七六):服务(1):local和remote

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...

  8. 【转】 Pro Android学习笔记(七十):HTTP服务(4):SOAP/JSON/XML、异常

    目录(?)[-] SOAP JSON和XMLPullParser Exception处理 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog. ...

  9. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

随机推荐

  1. Scrum介绍

    Scrum介绍 摘要 如今,项目管理的步伐越来越快.项目管理需要更灵活.更积极地,向应客户的需求.使用敏捷项目管理方法,项目经理可以在不影响价值.质量和商业规则的前提下实现所有目标,Scrum是一种迭 ...

  2. (转)create table #temptable 临时表 和 declare @bianliang table ()表变量

    在开发过程中,经常会遇到使用表变量和本地临时表的情况.下面是对二者的一个介绍: 1. 为什么要使用表变量 表变量是从2000开始引入的,微软认为与本地临时表相比,表变量具有如下优点:  a.与其他变量 ...

  3. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件

    public class BasePage:Page protected override void OnPreLoad(EventArgs e){     base.OnPreLoad(e);    ...

  4. composite

    #coding:utf-8 import math # 在确定函数前,我们先来了解下算法 # 有数 n 判断其是否是合数 # 如果 n 除以 range(2,math.sqrt(n)+1) 能够整除, ...

  5. MySQL的表分区

    什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区.当然 ...

  6. Kafka - SQL 代码实现

    1.概述 上次给大家分享了关于 Kafka SQL 的实现思路,这次给大家分享如何实现 Kafka SQL.要实现 Kafka SQL,在上一篇<Kafka - SQL 引擎分享>中分享了 ...

  7. centos中 mysql 5.7安装

    以免授权模式启动 编辑 /etc/my.cnf,添加以下内容: linux环境中:vi /etc/my.cnf 在[MySQL(和PHP搭配之最佳组合)d]配置段添加如下两行: user=mysql ...

  8. JSP Servlet性能分析

    JSP Servlet性能分析:http://www.docin.com/p-757790851.html

  9. A20(Cubieboard2)启动过程浅析

    A20支持从NAND Flash.SPI NOR Flash.SD card(SDC 0/2)和USB启动.当系统上电时,首先检测Boot Select Pin(BSP)管脚,如果为低电平,则直接从U ...

  10. PHP/MYSQL UTF8 中文排序

    1. 需要在php数组中用中文排序,但是一般使用utf8格式的文件,直接用asort排序不行.用gbk和gb2312可以.这跟几种格式的编码有关系.gbk和gb2312本身的编码就是用拼音排序的. f ...