绑定本地服务调用方法的步骤

服务的生命周期:

一、采用start的方式开启服务

生命周期如下:
onStart()过时了
开启服务: onCreate()--> onStartCommand() ---> onDestory();

如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和 onStartCommand();

服务停止的时候 onDestory().

服务只会被停止一次

Service若通过new来创建,则只能为一普通类,不是服务,服务创建必须通过框架实现,即调用服务的方法,必须由框架得到服务的引用。

二、服务还有一种开启方式,绑定的方式开启服务。
onCreate() --->onBind();--->onunbind()-->onDestory();
绑定服务不会调用onstart或者onstartcommand方法;

混合调用的服务的生命周期:
服务长期后台运行,又想调用服务的方法:
1.start方式开启服务(保证服务长期后台运行)
2.bind方式绑定服务(保证调用服务的方法)
3.unbind解除绑定服务
4.stopService停止服务。

远程服务:调用者和服务在不同的工程代码里面。
本地服务:调用者和服务在同一个工程代码里面。

每一个应用程序都是运行在自己独立的进程里面的。
进程操作系统分配内存空间的一个单位。进程的数据都是独立的。独立的内存空间。

aidl:android interface definition language 安卓接口定义语言
aidl文件都是公有的,没有访问权限修饰符
IPC: inter process communication 进程间通讯

1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
private class MiddlePerson extends Binder implements IMiddlePerson{}
2.实现服务的onbind方法,返回的就是中间人 MiddlePerson
3.在activity 绑定服务。bindService();
4.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
5.强制类型转化 调用接口里面的方法。

绑定远程服务调用方法的步骤:
1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
2.把暴露的接口文件的扩展名改为aidl文件 去掉访问修饰符 public
private class MiddlePerson extends IMiddlePerson.Stub{} IPC的子类
3.实现服务的onbind方法,返回的就是中间人 IMiddlePerson
4.在activity 绑定服务。bindService();
5.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
6.IMiddlePerson.Stub.asInterface(binder) 调用接口里面的方法。

//1.第一步服务要暴露方法 必须要有一个中间人,创建服务内部类,继承Binder,内部类中通过创建的方法调用服务方法,例:
private class MiddlePerson extends Binder {
/**
* 代办暂住证
* @param money 给钱 50块钱以上才给办。
*/
public void callMethodInService(int money){
if(money>=50){
methodInService();//服务中的方法
}else{
Toast.makeText(getApplicationContext(), "多准备点钱。", 0).show();
}
}
/**
* 陪领导打麻将
*/
public void playMajiang(){
System.out.println("陪领导打麻将。");
}
}
//2.实现服务成功绑定的代码 ,返回一个中间人。
@Override
public IBinder onBind(Intent arg0) {
System.out.println("服务被成功绑定了。。。。");
return new MiddlePerson();
}
1,2步均在服务中实现
//3.activity采用绑定的方式去开启服务。
Intent intent = new Intent(this,MyService.class);
conn = new MyConn();//MyConn是实现ServiceConnection接口的类,类如下
bindService(intent, conn, BIND_AUTO_CREATE);

private class MyConn implements ServiceConnection{
//4. 当服务被连接的时候调用 服务别成功 绑定的时候调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("在activity里面成功得到了中间人");
mp = (IMiddlePerson) service;
}
//当服务失去连接的时候调用(一般进程挂了,服务被异常杀死)
@Override
public void onServiceDisconnected(ComponentName name) {

}
}
//5.通过中间人调用服务里面的方法。
mp.callMethodInService(55);

三、两种开启服务方法的区别。

start方式开启服务。 一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者没有办法去调用服务里面的方法。(美国的司法独立)

bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。不求同时生,但求同时死。
开启者可以调用服务里面的方法。

时间: 2024-11-09 05:09:43

绑定本地服务调用方法的步骤的相关文章

WebService服务调用方法介绍

1 背景概述 由于在项目中需要多次调用webservice服务,本文主要总结了一下java调用WebService常见的6种方式,即:四种框架的五种调用方法以及使用AEAI ESB进行调用的方法. 2 预期读者 数通畅联内部员工 广大计算机爱好者 3 名词解释 Web Service也叫XML Web Service: WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是通过SOAP在Web上提供的软件服务,使用WSDL

redis安装到本地服务的方法

要安装Redis,首先要获取安装包. Windows的Redis安装包需要到以下GitHub链接找到. 链接:https://github.com/MSOpenTech/redis 打开网站后,找到Release,点击前往下载页面. 2 在下载网页中,找到最后发行的版本(此处是3.2.100). 找到Redis-x64-3.2.100.msi和Redis-x64-3.2.100.zip,点击下载. 这里说明一下,第一个是msi微软格式的安装包,第二个是压缩包. 3 双击刚下载好的msi格式的安装

【黑马Android】(10)绑定的方式调用服务的方法/图片的各种操作/人脸识别

绑定的方式调用服务的方法 服务的生命周期: 一.采用start的方式开启服务 生命周期如下: onStart()过时了 开启服务:onCreate()--> onStartCommand() ---> onDestory(); 如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和 onStartCommand(); 服务停止的时候onDestory(). 服务只会被停止一次 二.服务还有一种开启方式,绑定的方式开启服务. onCreate()--->on

Java进阶(三十一) Web服务调用

Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd503-68fc-4406-b8f2-5e90095be303/19b67e36aa2ccd19 查看代码之后,按照以往的服务调用方法实现,结果无法实现.很是费解,求教大师兄之后,问题,迎刃而解,只能说自己需要学习的地方还有很多. 完整代码如下: package plan.http.util; imp

绑定服务调用本地服务中的方法

如果想调用服务中的方法, 通过startService()是做不到的, 这时需要用bindService来解决. 下面的demo是在Activity中调用Service中的自定义方法---methodInService 这个demo可以解决在项目开发中调用service里的数据. 这里在service中使用到了代理模式.这是为了,给service组件和activity组件中间添加一个中间人. 通过代理来传递数据.也就是binder对象.这个代理就是接口IService Service中的代码如下

绑定服务调用远程服务中的方法

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Se

Android(java)学习笔记228:服务(service)之绑定服务调用服务里面的方法

1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 :                     bindService(intent, new MyConn(), BIND_AUTO_CREATE): 参数intent:意图对象,服务对应的意图对象  new  Intent(this,Service.class) 参数ServiceConnection (接口,自定义其接口实现内部类MyConn() ):通讯

android之绑定服务调用服务的方法

public class MainActivity extends Activity { private music.MyBinder mm;//在activity里面得到服务ibinder对象的引用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public v

Android--绑定服务调用服务的方法

Service按照其启动的方式,可分为两种: 1.Started Started的Service,通过在Application里用startService(Intent intent)方法来启动.这种类型的Service一经启动,会在后面无休止地运行,即使启动它的Activity被Destroy掉.要停止此类型的Service,可在Service中调用stopSelf()或在Application中调用stopService(Intent intent),要不然就只能等Android系统在系统资