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,一经查实,立即删除!

相关文章

java 动态队列_RabbitMq之动态修改队列参数

RabbitMq不支持修改已经存在的队列和交换机参数&#xff0c;可以通过创建失败&#xff0c;捕获异常信息&#xff0c;然后删除原队列或交换机&#xff0c;然后重新创建&#xff0c;以达到修改参数的功能。package com.sky.study.delete;import java.io.IOException;import java.…

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

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

mysql subindex_mssql server sql分页存储过程

set quoted_identifier ongoset ansi_nulls ongocreate proc execbypagesqlquery varchar(2000), --//输入参数&#xff1a;sql检索语句或表名pagesize int, --//输入参数&#xff1a;每页显示记录条数pageindex int --//输入参数&#xff1a;当前页码asset nocount onset ansi…

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;当一个对…

MySql学习之varchar类型

MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255&#xff0c;其数据范围可以是0~255或1~255&#xff08;根据不同版本数据库来定&#xff09;&#xff0c;在 MySQL5.0以上的版本中&#xff0c;varchar数据类型的长度支持到了65535&#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…

java 静态类的实现_[Java教程]Javascript 静态类的实现

[Java教程]Javascript 静态类的实现0 2012-04-06 11:00:05早些天写过了类的实现&#xff0c;接着我们看看的静态类的实现。这东西在Javascript里用得会非常的频繁&#xff0c;因为针对现在的网页&#xff0c;多个基于同一个类对象的页面不多&#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;于是就没有了这些不起眼但非常好用的…

java整数划分递归_整数划分问题(递归法)

整数划分问题是算法中的一个经典命题之一&#xff0c;有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分&#xff0c;是指把一个正整数n写成如下形式&#xff1a;nm1m2...mi; (其中mi为正整数&#xff0c;并且1 < mi < n)&#xff0c;则{m1,m2,...,mi}为n的一…

数组移位

昨天今日头条笔试&#xff0c;发现好简单&#xff0c;一写出了几个问题&#xff0c;回来才想出来。 一个长度不超过10000的整数数组&#xff0c;里面有若干个0&#xff0c;请事先一段代码&#xff0c;将数组中值为0的元素移动到数组的最前面&#xff0c;其余元素相对位置保持不…

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

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

java技术学习内容_Java开发主要都学些什么内容?

展开全部Java开发培训班主要学32313133353236313431303231363533e58685e5aeb931333363386164习的课程大纲&#xff0c;你可以看下。第一阶段:JavaSE基础、MySQL数据库应用1.1 Java SE基本语法Eclipse开发环境类和对象封装、继承和多态Java数据结构(栈、队列、链表的实现)IO流技…

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

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

LeetCode Longest Common Prefix

原题链接在这里&#xff1a;https://leetcode.com/problems/longest-common-prefix/ 题目&#xff1a; Write a function to find the longest common prefix string amongst an array of strings. 题解&#xff1a; strs中的第一个字符串从i 0 开始&#xff0c;取char, 取出c…

java 主方法 this_java main 方法怎么创建

学校作业。。publicstaticvoidmain(String[]args){不知道加在哪里packagepersonproject;publicclassPerson{publicstaticintlastId0;privateStringname;privateStringgender;privateS...学校作业。。public static void main(String[] args) {不知道加在哪里package personproj…

输出国际象棋输出余弦曲线

输出国际象棋棋盘 1 #include <stdio.h>2 #include <stdlib.h>3 #include <windows.h>4 int main(){5 int i,j;6 SetConsoleOutputCP(437);//显示大于127的ASiic 码 7 for(i0;i<8;i){8 for(j0;j<8;j){9 if((ij)%20 ){…

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

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