Service介绍:

与Acitivity平级的Android四大组件之一,对比Activity而言,就是没有交互界面,且可以一直在后台执行,只用于处理下载,I/O等长时间信息交流的任务。

Service的生命周期和运行顺序:

Service的生命周期只有启动状态和摧毁状态,相比Activity而言,更需要特别注意创建和摧毁的过程。

Service运行或被杀死的情况:

1.直接startService()后,若不调用stopService()或stopService()来停止的话,Service将一直运行下去,即使启动的控件已经退出

2.当Service使用bindService()方法来启动的时候,当绑定的组件全部解除绑定则Service被系统杀死,若启动方式是startService()->bindService(),则必须依次使用stopService()和unbindService()来停止Service,此时只使用一种方法,无法杀死Service。

Service有两种运行轨迹:

未绑定的Service:

调用startService()->onCreate()->onstartConmmand()->stopService()->ondestory()

直接绑定方法启动Service:

调用bindService()->onCreate()->onBind()->onServiceConnected()->unbindService()->onDestory()

注:onServiceDisConnected() 在所在的线程被杀死和摧毁时调用,但目前没有找到测试运行的方法。

这两种状态Service的运行流程的在信息传递上应用:

未绑定Service信息传递的原理:

1.startService()方法会传递给onstartConmmand()方法一个Intent对象,Intent对象可以携带信息

2.被onstartConmmand()接收后,就从Activity对象将信息传递到了Service中

3.Service可以被很多空间绑定,以实现多个Activity之间的信息共享

绑定Service在同应用之间的信息传递原理:

1.onBind()方法会返回一个Ibinder对象被onServiceConnected()接收,

2.返回的Ibinder对象由自己自定义一个类,继承android.os.Binder,携带需要传递的信息或提供修改Service属性地方法

3.通过onBind()返回自定义的类的对象给onServiceConnected(),在onServiceConnected()的方法中,接收这个自定义的类的对象实例的信息,就完成了Service到Activity之间的信息交流。

绑定Service在不同应用之间的信息传递原理:

1.onBind()方法会返回一个Ibinder对象被onServiceConnected()接收

2.为了实现不同应用之间的交流需要使用到AIDL文件中的接口,首先在被启动的Service所在的Project中新建一个AIDLinterface,在这个接口中可以给出用来信息交互的抽象函数

3.然后在被启动的Service中的onBind()方法中返回一个该接口对象.Stub()方法,并在Service中实现此接口的抽象函数,用于改变Service中的属性或对外提供获取Service属性的方法

4.然后将此Service所在的Project的AIDL文件包拷贝一份在另一个调用的程序Project中

5.在调用Service的程序中定义一个AIDLinterface实例,实现的onServiceConnected()用来接收返回的interface.Stub()

6.此时接口中包含了修改Service属性的方法和获取Service中属性的方法,以此来实现不同程序之间的Activity和Service之间的信息交流

在同一应用下的Service应用:

Service的启动:

Intent i = new Intent(Activity.this,Service.class);
startService(i);

Service的绑定:

bindService(new Intent(Activity.this,Service.class),MainActivity.this,
Context.BIND_AUTO_CREATE)
//需要在此方法内实现 onServiceConnected()和 onServiceDisConnected()

通过Service传递信息:

Intent i = new Intent(Activity.this,Service.class);
i.putExtra("StringName","StringInformation");
startService(i);

在不同应用之间的Service应用:

Service的启动:

Intent i = new Intent();
i.setComponent(new ComponentName("andrew.com.destinationservice","andrew.com.destinationservice.MyService"));
//i.
i.setComponent(new ComponentName("所在程序的完整包名","目标Service在项目中的索引"));
startService(i);

Service的绑定:

bindService(new Intent().setComponent(new ComponentName("andrew.com.destinationservice",
"andrew.com.destinationservice.MyService")),MainActivity.this, Context.BIND_AUTO_CREATE);

Service绑定后传递信息:

AIDLW接口中的代码信息:

interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
void setData(String data);//设置Service中的data属性
String getData();    //向外界提供获取Service中data属性的方法
}

Service.java中对于媒介interface的处理代码:

@Override
public IBinder onBind(Intent intent) {
Toast.makeText(getApplicationContext(),"onBind",Toast.LENGTH_SHORT).show();
return new IMyAidlInterface.Stub() {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { } @Override
public void setData(String data) throws RemoteException {
MyService.this.data=data;
} @Override
public String getData() throws RemoteException {
return MyService.this.data;
}
};
}

Activity中使用AIDLinterface实现信息交流的代码:

  
//接收onBind()传回来的interface.stub() 
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
   binder = IMyAidlInterface.Stub.asInterface(service);
}
//使用按钮来同步service和Activity的信息部分
sync.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
  if (binder!=null){
try {
  binder.setData(show.getText().toString());
Toast.makeText(getApplicationContext(),binder.getData(),Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
  e.printStackTrace();
}
}
}
});

注:

1.interface.stub()方法的具体意义尚未研究

2.Service还有一些在Manifests文件中的配置信息没有去研究和测试

Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信的更多相关文章

  1. Service的启动与停止、绑定与解绑

    ---恢复内容开始--- Service的意义就在于当软件停止之后还可以在背景中进行运行,换句话也就是说,比如一个音乐播放器,当我们退出音乐播放器的时候,还是希望它在背景中运行,也就是一直播放着音乐, ...

  2. (转) 在linux网络UDP通信中,关于客户端是否绑定的理解

    最近在做一个实例,是用RTSP协议完成.服务器已经有了,只需要把客户端做好就行了,在做的过程中发现了一些问题,就是关于UDP客户端是否绑定的问题. 也许大家在书上看到的大多都是说UDP客户端不需要绑定 ...

  3. Service 简介 启动方式 生命周期 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. Android WifiDisplay分析一:相关Service的启动

    网址:http://www.2cto.com/kf/201404/290996.html 最近在学习Android 4.4上面的WifiDisplay(Miracast)相关的模块,这里先从WifiD ...

  5. 插件占坑,四大组件动态注册前奏(二) 系统Service的启动流程

    转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52203903 前言:为什么要了解系统Activity,Service,BroadCas ...

  6. Service的启动方式

    Service的启动方式: 两种启动模式,一种是非绑定启动模式,另一种是绑定启动模式. 一.startservice方式启动 Intent intent = new Intent(this, Firs ...

  7. Reporting Service 服务启动时报错The service did not respond to the start or control request in a timely fashion

    案例环境: 启动一台数据库服务器(Windows Server 2003)的Reporting Service(SQL Server 2008 R2)服务时,出现如下错误信息: System.Inva ...

  8. apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定

    摘要:apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定,根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管用的让apache支持中文域名 ...

  9. Android深入四大组件(六)Service的启动过程

    前言 此前我用较长的篇幅来介绍Android应用程序的启动过程(根Activity的启动过程),这一篇我们接着来分析Service的启动过程.建议阅读此篇文章前,请先阅读Android深入四大组件(一 ...

随机推荐

  1. Java开发各层对象专用名词含义 PO,VO,DAO,BO,DTO,POJO, BYO,Entity,JavaBean,JavaBeans

    Java的几种名词(PO,VO,DAO,BO,POJO)解释 PO:persistant object 持久对象.可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一 ...

  2. python程序化交易神器——tushare

    一直想试着将自己的交易思路程序化,可惜困难重重 ,连第一步获取数据都要花很多精力,直到最近发现了Tushare,不仅使用非常便利,功能也无比强大,股票.期货.基金.财经新闻,甚至电影票房等都可以非常便 ...

  3. Spring MVC 处理JSON | JSONP类型数据

    SpringMVC返回JSON格式的数据: 1 添加jar包(gson-2.8.0.jar): <dependency> <groupId>com.google.code.gs ...

  4. Maven中-DskipTests和-Dmaven.test.skip=true的区别

    在使用mvn package进行编译.打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip= ...

  5. CF1133E K Balanced Teams(DP)

    /* 排序之后每个点往前能选择的是一段区间, 所以我们实际上转移位置是确定的 然后f[i][j]表示到了i选了j段的最大贡献, 显然状态数是O(n^2)的, 转移是O(1)的 */ #include& ...

  6. spring boot 整合pagehelper分页插件

    Spring Boot 整合pagehelper分页插件 测试环境: spring boot  版本 2.0.0.M7 mybatis starter 版本  1.3.1 jdk 1.8 ------ ...

  7. scrapy中 selenium(中间件) + 语言处理 +mysql

    在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现,通过 ...

  8. 网易云音乐mp3外链、真实地址下载方法

    一个网易音乐外链地址长期有效,很简单的方法: 第一步打开网易云音乐,随便找到一首歌,播放,复制网址的ID, 例如:杨钰莹的心雨,网址是: http://music.163.com/#/song?id= ...

  9. docker unbuntu 32-bit 更新apt-get

    1.vi /etc/apt/sources.list deb http://mirrors.aliyun.com/debian wheezy main contrib non-free deb-src ...

  10. oracle TDE

    转自:oracle TDE学习系列 (1) — wallet 使用管理 关于oracle wallet,通常称为oracle钱夹,说的通俗一点,oracle wallet是一个用 口令加密的PKCS# ...