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

1.绑定服务调用服务里面的方法,图解:

步骤:

(1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 

                    bindServiceintent, new MyConn(), BIND_AUTO_CREATE);

参数intent:意图对象,服务对应的意图对象  new  Intent(this,Service.class)

参数ServiceConnection (接口,自定义其接口实现内部类MyConn() ):通讯频道,利用他可以获取服务成功绑定后得到的秘书

参数BIND_AUTO_CREATE:常量,服务不存在会自动创建

 

(2)实现MyConn接口实现内部类

 

/*** 服务连接成功的通讯频道**/private class MyConn implements ServiceConnection{//当服务被成功连接的时候调用的方法
        @Overridepublic void onServiceConnected(ComponentName name, IBinder service) {重要参数IBinder,代表的就是中间人,服务的秘书 }//当服务失去连接的时候调用的方法
        @Overridepublic void onServiceDisconnected(ComponentName name) {  }  }

 

 

(3)如果服务被成功绑定  会执行onBind的方法       

public  IBinder onBind (Intent  intent )

这个方法的返回值为 IBinder 就是服务内部的秘书

 

(4)扩展实现服务内部的秘书,可以间接的调用服务的方法

      /*** 服务内部的秘书,可以调用服务的方法**/public class MyBinder extends Binder{/*** 调用服务的方法。* @param money 钱*/public void callMethodInService(int money){if(money>500){methodInService();}else{Toast.makeText(DemoService.this, "这点钱还想办事呀?", 0).show();}}}

 

(5)在MyConn成功绑定的时候,就得到了IBInder对象, MyBinder

(6)利用MyBinder间接调用服务的方法

 

2.案例代码:

(1)布局文件activity_main.xml

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context=".MainActivity" >
 7 
 8     <Button
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:onClick="bind"
12         android:text="绑定服务" />
13 
14     <Button
15         android:layout_width="match_parent"
16         android:layout_height="wrap_content"
17         android:onClick="unbind"
18         android:text="解除绑定服务" />
19 
20     <Button
21         android:layout_width="match_parent"
22         android:layout_height="wrap_content"
23         android:onClick="call"
24         android:text="调用服务里面的方法" />
25 
26 </LinearLayout>

布局效果如下:

(2)MainActivity.java

 1 package com.itheima.bind;
 2 
 3 import com.itheima.bind.DemoService.MyBinder;
 4 
 5 import android.app.Activity;
 6 import android.content.ComponentName;
 7 import android.content.Intent;
 8 import android.content.ServiceConnection;
 9 import android.os.Bundle;
10 import android.os.IBinder;
11 import android.view.View;
12 
13 public class MainActivity extends Activity {
14     MyBinder myBinder;
15 
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20     }
21     
22     protected void onDestory(Bundle savedInstanceState) {
23         super.onDestory();
24         ----;//解绑服务
25     }
26 
27     /**
28      * 绑定服务,获取服务里面的秘书,间接的调用服务里面的方法。
29      * @param view
30      */
31     public void bind(View view){
32         Intent intent = new Intent(this,DemoService.class);
33         //intent 意图
34         //conn 服务的通讯频道
35         //1 服务如果在绑定的时候不存在,会自动创建
36         System.out.println("1.采用bind的方式开启服务");
37         bindService(intent, new MyConn(), BIND_AUTO_CREATE);
38     }
39     
40     
41     /**
42      * 解绑服务
43      * @param view
44      */
45     public void unbind(View view){
46        
47         System.out.println("解绑服务");
48         if(myBinder != null) {
49             unbindService(new MyConn());
50             myBinder = null;
51         }
52    
53     }
54     /**
55      * 服务连接成功的通讯频道
56      *
57      */
58     private class MyConn implements ServiceConnection{
59         //当服务被成功连接的时候调用的方法
60         @Override
61         public void onServiceConnected(ComponentName name, IBinder service) {
62             System.out.println("3. 得到了服务的一个连接,通讯频道,获取到服务内部的秘书");
63             myBinder = (MyBinder) service;
64             System.out.println("4.把ibinder强制类型转化成秘书MyBinder");
65         }
66         //当服务失去连接的时候调用的方法
67         @Override
68         public void onServiceDisconnected(ComponentName name) {
69             
70         }
71     }
72     
73     /**
74      * 调用服务里面的方法。
75      * @param view
76      */
77     public void call(View view){
78         System.out.println("5.利用mybinder间接的调用服务的方法");
79         myBinder.callMethodInService(3000);
80     }
81 }

 

其中创建的服务DemoService.java如下:

 1 package com.itheima.bind;
 2 
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.Binder;
 6 import android.os.IBinder;
 7 import android.widget.Toast;
 8 
 9 public class DemoService extends Service {
10 
11     /**
12      * 在服务被绑定的时候调用的方法
13      * 
14      * IBinder 服务内部的秘书
15      */
16     @Override
17     public IBinder onBind(Intent intent) {
18         System.out.println("2. 服务如果成功绑定会执行onbind,返回服务内部的秘书 mybinder");
19         return new MyBinder();
20     }
21     /**
22      * 服务内部的秘书,可以调用服务的方法
23      *
24      */
25     public class MyBinder extends Binder{
26         /**
27          * 调用服务的方法。
28          * @param money 钱
29          */
30         public void callMethodInService(int money){
31             if(money>500){
32                 methodInService();
33             }else{
34                 Toast.makeText(DemoService.this, "这点钱还想办事呀?", 0).show();
35             }
36         }
37     }
38     
39     
40 
41     /**
42      * 服务里面的方法
43      */
44     public void methodInService(){
45         Toast.makeText(this, "哈哈,我是服务的方法,被你调用了。", 0).show();
46     }
47     
48     @Override
49     public void onCreate() {
50         System.out.println("服务被创建了");
51         super.onCreate();
52     }
53     @Override
54     public void onDestroy() {
55         System.out.println("服务被销毁了。");
56         super.onDestroy();
57     }
58 }

这里定义一个Service,当然要在AndroidMainfest.xml文件中注册一下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.itheima.bind"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6 
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="17" />
10 
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name="com.itheima.bind.MainActivity"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21 
22                 <category android:name="android.intent.category.LAUNCHER" />
23             </intent-filter>
24         </activity>
25         <service android:name="com.itheima.bind.DemoService"></service>
26     </application>
27 
28 </manifest>

 

3. 绑定服务的应用场景

 提供一个服务,后台运行,里面有一些公共的逻辑供调用.

>1. 微信支付, 微信有一个支付的服务,绑定,调用支付的方法
>2. sony手机,人脸识别的服务,绑定到这个服务传递一个照片就会把人脸标记出来
>3. 音乐播放器,后台服务里面播放音乐绑定服务暂停下一曲上一曲

转载于:https://www.cnblogs.com/hebao0514/p/4800175.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1909. 删除一个元素使数组严格递增

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums &#xff0c;如果 恰好 删除 一个 元素后&#xff0c;数组 严格递增 &#xff0c;那么请你返回 true &#xff0c;否则返回 false 。 如果数组本身已经是严格递增的&#xff0c;请你也返回 true 。 数组…

ATS push cache 测试

测试 ATS 注入缓存 参考了&#xff1a; http://serverfault.com/questions/471684/push-content-to-apache-traffic-servers-cache 得到返回&#xff1a;HTTP/1.0 400 Response Not Cachable 搜索得知&#xff0c;头部传入信息太少&#xff0c;必须包含反映时间的项。那个回答应…

fastapi 响应模型 / 响应状态码 / 表单参数

文章目录1. response_model2. 添加输出模型3. 响应模型编码参数4. response_model_include 和 response_model_exclude5. 代码复用&#xff1a;继承6. Union7. 任意 dict 的响应8. 响应状态码9. 表单参数learn from https://fastapi.tiangolo.com/zh/tutorial/response-model/ …

java对象内存模型_Java对象的内存模型

众所周知&#xff0c;函数调用在内存中是通过压栈&#xff0c;退栈实现的&#xff0c;而Java的方法调用则是在JVM栈中通过栈帧实现的&#xff0c;且所有的Java对象都只在堆上分配内存&#xff0e;那么一个Java对象在堆内存里到底长啥样呢&#xff1f;实际上&#xff0c;当一个对…

fastapi 请求文件 / 表单 / 处理错误 / 路径操作配置 / jsonable_encoder

文章目录1. File 参数2. 多文件上传3. 请求表单与文件4. 处理错误5. 自定义响应头6. 自定义异常处理器7. 覆盖默认异常处理器8. 使用 RequestValidationError 的请求体9. 复用 FastAPI 异常处理器10. 路径操作参数配置10.1 status_code&#xff0c;tags10.2 summary&#xff0c…

fastapi PUT更新数据 / PATCH部分更新

文章目录1. PUT 更新2. 用 PATCH 进行部分更新learn from https://fastapi.tiangolo.com/zh/tutorial/body-updates/1. PUT 更新 注意&#xff0c;put 没有指定的值&#xff0c;会被重置为默认值 from typing import List, Optionalfrom fastapi import FastAPI from fastap…

Chrome 扩展 最近的历史 HistoryBar v1.1

说明 以前用过一段时间傲游浏览器&#xff0c;渐渐的习惯了它的鼠标手势和一些细微的人性化的功能。比方地址栏左边的“近期訪问的页面”button。能够方便的找到近期 20 条历史记录。 但后来因为某些原因又回到了 Chrome 的怀抱&#xff0c;于是就没有了这些不起眼但非常好用的…

LeetCode 2047. 句子中的有效单词数

文章目录1. 题目2. 解题1. 题目 句子仅由小写字母&#xff08;a 到 z&#xff09;、数字&#xff08;0 到 9&#xff09;、连字符&#xff08;-&#xff09;、标点符号&#xff08;!、. 和 ,&#xff09;以及空格&#xff08; &#xff09;组成。 每个句子可以根据空格分解成 …

LeetCode 2048. 下一个更大的数值平衡数(枚举)

文章目录1. 题目2. 解题1. 题目 如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。 那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0c;请你返回 严格大于 n 的 最小数值平衡数 。 示例 1&#xff1a; 输入&#xff1a…

LeetCode 2049. 统计最高分的节点数目(DFS)

文章目录1. 题目2. 解题1. 题目 给你一棵根节点为 0 的 二叉树 &#xff0c;它总共有 n 个节点&#xff0c;节点编号为 0 到 n - 1 。 同时给你一个下标从 0 开始的整数数组 parents 表示这棵树&#xff0c;其中 parents[i] 是节点 i 的父节点。 由于节点 0 是根&#xff0c;所…

python源文件编码的含义_【原创】Python 源文件编码解读

以下内容源于对 PEP-0263 的翻译和解读&#xff0c;同时给出了一些网上网友的说法。 我是分割线 PEP 0263 -- Defining Python Source Code Encodings【摘要】给出声明 Python 源文件编码的语法。该编码信息后续会被 Python 解析器用于解析源文件。这种方式增强了对源文件中 U…

MyEclipse中SVN的常见的使用方法

本次主要内容&#xff1a; 一 、导入项目 &#xff08;Checkout&#xff09;。从svn资源库检出 二 、更新 &#xff08;Update&#xff09; 三、锁&#xff08;对要修改的文件加锁&#xff0c;防止文件冲突&#xff09; 四、提交&#xff08;项目修改后的提交&#xff09; 五、…

fastapi 路径依赖项Depends / 装饰器依赖dependencies / 全局依赖 / 带 yield 的依赖

文章目录1. 依赖项2. 类作为依赖3. 子依赖项3.1 多次使用同一个依赖项4. 路径操作装饰器依赖项5. 全局依赖项6. 带 yield 的依赖项7. 使用带 yield 上下文管理器作为依赖项learn from https://fastapi.tiangolo.com/zh/tutorial/dependencies/ 1. 依赖项 只能传给 Depends 一…

fastapi 安全性 / APIRouter / BackgroundTasks / 元数据 / 测试调试

文章目录1. 例子2. 获取当前用户3. 使用密码和 Bearer 的简单 OAuth24. 使用&#xff08;哈希&#xff09;密码和 JWT Bearer 令牌的 OAuth25. 多个应用文件5.1 APIRouter6. BackgroundTasks7. 元数据7.1 标题、描述和版本7.2 openapi_tags 标签元数据7.3 OpenAPI URL7.4 文档 …

java json path_Java使用JSONPath解析JSON完整内容详解

JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言&#xff0c;如Javascript&#xff0c;Python和PHP&#xff0c;Java。JsonPath提供的json解析非常强大&#xff0c;它提供了类似正则表达式的语法&#xff0c;基本上可以满足所有你想要获得的js…

LeetCode 2050. 并行课程 III(拓扑排序)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n &#xff0c;表示有 n 节课&#xff0c;课程编号从 1 到 n 。 同时给你一个二维整数数组 relations &#xff0c;其中 relations[j] [prevCoursej, nextCoursej] &#xff0c;表示课程 prevCoursej 必须在课程 nextCoursej 之前…

LeetCode 1521. 找到最接近目标值的函数值(位运算)

文章目录1. 题目2. 解题1. 题目 Winston 构造了一个如上所示的函数 func 。他有一个整数数组 arr 和一个整数 target &#xff0c;他想找到让 |func(arr, l, r) - target| 最小的 l 和 r 。 请你返回 |func(arr, l, r) - target| 的最小值。 请注意&#xff0c; func 的输入参…

LeetCode 2053. 数组中第 K 个独一无二的字符串(哈希)

文章目录1. 题目2. 解题1. 题目 独一无二的字符串 指的是在一个数组中只出现过 一次 的字符串。 给你一个字符串数组 arr 和一个整数 k &#xff0c;请你返回 arr 中第 k 个 独一无二的字符串 。 如果 少于 k 个独一无二的字符串&#xff0c;那么返回 空字符串 “” 。 注意…

LeetCode 2055. 蜡烛之间的盘子(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个长桌子&#xff0c;桌子上盘子和蜡烛排成一列。 给你一个下标从 0 开始的字符串 s &#xff0c;它只包含字符 * 和 | &#xff0c;其中 * 表示一个 盘子 &#xff0c;| 表示一支 蜡烛 。 同时给你一个下标从 0 开始的二维整数数组 que…

策略模式java 用例_java策略模式简单用例

运用java策略模式一个小程序/****/package Strategy;import java.util.Arrays;/*** author HuangRong* Funtion 定义策略*/public interface ComputablesStra {public abstract void printForm();}/****/package Strategy;/*** author HuangRong* Function 为策略模式中的上下文…