Android实验:绑定service实验

目录

  • 实验目的
  • 实验内容
  • 实验要求
  • 项目结构
  • 代码实现
  • 代码解释
  • 结果展示

实验目的

充分理解Service的作用,与Activity之间的区别,掌握Service的生命周期以及对应函数,了解Service的主线程性质;掌握主线程的界面刷新的设计原则,掌握启动service的方式,及其工作原理;
在此实验中,掌握启动式和绑定式Service之间的原理及区别,了解其性能上的不同

实验内容

  1. 在service中实现一个加法函数add(int x,int y)
  2. 并在Activity界面实现对service方法add的调用,实现加法计算。
  3. 在activity界面上有两个文本框输入数字,第三个文本框实现显示计算结果,一个button实现计算触发。

实验要求

1、配置service的运行环境以确保service的正确使用
2、熟悉绑定service的方式和使用的操作步骤
3、充分理解service的工作原理与其生命周期

项目结构

在这里插入图片描述

代码实现

mainActivity

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class mainActivity extends Activity {

    private EditText etNum1, etNum2;
    private TextView tvResult;
    private Button btnCalculate;
    private AdditionService additionService;
    private boolean isBound = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etNum1 = findViewById(R.id.et_num1);
        etNum2 = findViewById(R.id.et_num2);
        tvResult = findViewById(R.id.tv_result);
        btnCalculate = findViewById(R.id.btn_calculate);

        btnCalculate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isBound) {
                    int num1 = Integer.parseInt(etNum1.getText().toString());
                    int num2 = Integer.parseInt(etNum2.getText().toString());
                    int result = additionService.add(num1, num2);
                    tvResult.setText(String.valueOf(result));
                }
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, AdditionService.class);
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (isBound) {
            unbindService(serviceConnection);
            isBound = false;
        }
    }

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            AdditionService.LocalBinder binder = (AdditionService.LocalBinder) service;
            additionService = binder.getService();
            isBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isBound = false;
        }
    };
}

AdditionService

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class AdditionService extends Service {
    private final IBinder binder=new LocalBinder();
    public class LocalBinder extends Binder{
        AdditionService getService(){
            return  AdditionService.this;
        }
    }
    @Override
    public IBinder onBind(Intent intent){
        return binder;
    }
    public int add(int x,int y){
        return x+y;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/et_num1"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:hint="请输入第一个数字"
        android:inputType="number" />


    <EditText
        android:id="@+id/et_num2"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:hint="请输入第二个数字"
        android:inputType="number" />

    <Button
        android:id="@+id/btn_calculate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="计算" />

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="结果是"
        android:textSize="24sp" />

</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Exp4"
        tools:targetApi="31">
        <activity
            android:name=".mainActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:theme="@style/Theme.Exp4">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.example.exp4.AdditionService" />
    </application>

</manifest>

代码解释

代码分为三个部分:

mainActivity.java: 这是主活动类,负责创建用户界面和与服务绑定。它包含以下内容:

一些私有变量,用于存储两个输入框(etNum1和etNum2)、一个显示结果的文本视图(tvResult)、一个计算按钮(btnCalculate)和一个AdditionService的引用(additionService)。
一个布尔变量(isBound),用于标记是否与服务绑定。
一个onCreate方法,用于初始化界面元素,并为计算按钮设置点击监听器。当用户点击按钮时,如果已经与服务绑定,就从输入框中获取两个数字,并调用服务的add方法,将结果显示在文本视图中。
一个onStart方法,用于在活动启动时创建一个意图(intent),并用它来绑定服务。绑定服务时,需要传入一个服务连接对象(serviceConnection),用于监听服务的连接和断开状态。
一个onStop方法,用于在活动停止时解除服务的绑定,并将isBound设为false。
一个serviceConnection对象,用于实现ServiceConnection接口的两个方法:onServiceConnected和onServiceDisconnected。当服务连接时,会获取服务的IBinder对象,并将它转换为LocalBinder对象,然后通过它获取服务的引用,并将isBound设为true。当服务断开时,会将isBound设为false。
AdditionService.java: 这是一个服务类,负责提供两个数字相加的功能。它包含以下内容:

一个IBinder对象(binder),用于返回给绑定服务的活动。
一个内部类(LocalBinder),继承自Binder类,用于提供一个getService方法,返回服务本身的引用。
一个onBind方法,用于返回binder对象,当活动绑定服务时,会调用这个方法。
一个add方法,用于接收两个整数参数(x和y),并返回它们的和。

activity_main.xml: 这是一个布局文件,用于定义用户界面的外观。它包含以下内容:

一个线性布局(LinearLayout),用于垂直排列所有的子视图,它的宽度和高度都是填充父视图,它的内边距是16dp。
两个编辑框(EditText),用于让用户输入两个数字,它们的宽度都是填充父视图,高度都是48dp,它们的提示文字分别是“请输入第一个数字”和“请输入第二个数字”,它们的输入类型都是数字。
一个按钮(Button),用于触发计算操作,它的宽度是包裹内容,高度也是包裹内容,它的水平居中,它的文本是“计算”。
一个文本视图(TextView),用于显示计算结果,它的宽度是包裹内容,高度也是包裹内容,它的水平居中,它的初始文本是“结果是”,它的字体大小是24sp。

结果展示

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 编译安装colmap

COLMAP可以作为独立的app&#xff0c;通过命令行或者图形交互界面使用&#xff0c;也可以作为一个库被包含到其他源代码中。 这里记录一下编译安装colmap的过程&#xff0c;首先需要安装好CUDA&#xff0c;CUDA具体安装过程这里就不赘述了。在GitHub上下载源代码&#xff0c;我…

计算机网络的性能

目录 一、计算机网络的性能指标——宽带 二、计算机网络的性能指标——时延 三、计算机网络的性能指标——时延带宽积 四、计算机网络的性能指标——往返时延 五、计算机网络的性能指标——吞吐量 六、计算机网络的能能指标——利用率 计算机网络的定义&#xff1a;计算机网络时…

策略设计模式

package com.jmj.pattern.strategy;public interface Strategy {void show(); }package com.jmj.pattern.strategy;public class StrategyA implements Strategy{Overridepublic void show() {System.out.println("买一送一");} }package com.jmj.pattern.strategy;p…

力扣日记12.3-【二叉树篇】二叉树的所有路径

力扣日记&#xff1a;【二叉树篇】二叉树的所有路径 日期&#xff1a;2023.12.3 参考&#xff1a;代码随想录、力扣 257. 二叉树的所有路径 题目描述 难度&#xff1a;简单 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径…

中序和前/后序遍历构造二叉树———通用做法

1. 前序和中序遍历 **思路&#xff1a;我们每一次一定可以根据递归确定根节点是哪个&#xff0c;就是前序第一个数&#xff0c;然后找中序遍历这个点&#xff0c;看左子树有几个节点&#xff0c;右子树有几个节点&#xff0c;然后就可以根据节点个数&#xff0c;递归左子树和右…

什么是跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;通常称为XSS&#xff09;&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;在线论坛、博客、留言板等共享…

「C++」位图和布隆过滤器

&#x1f4bb;文章目录 位图概念位图的实现位图的应用 布隆过滤器概念布隆过滤器的哈希函数布隆过滤器的插入布隆过滤器的查找布隆过滤器的删除 &#x1f4d3;总结 位图 概念 所谓位图&#xff0c;就是在每一位bit位上存放某种状态&#xff0c;1就代表存在&#xff0c;0就代表…

SpringSecurity 三更草堂 学习笔记

SpringSecurity从入门到精通 0. 简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的…

三菱(MITSUBISHI)CNC数据采集

一&#xff0c;概述 前面介绍过&#xff0c;三菱CNC数据采集一般有两种方法&#xff1a; &#xff08;1&#xff09;通过官方A2 API&#xff08;也叫EZSocket&#xff09;进行数据采集&#xff0c;需要安装A2驱动包&#xff08;仅适用于windows系统&#xff09; &#xff08;…

SimpleDataFormat 非线程安全

目录 前言 正文 1.出现异常 2.解决方法1 3.解决方法2 总结 前言 SimpleDateFormat 类是 Java 中处理日期和时间格式化和解析的类&#xff0c;但它并不是线程安全的。这意味着多个线程不能安全地共享一个 SimpleDateFormat 实例进行日期和时间的解析和格式化。当多个…

【JavaScript手撕代码】函数柯里化

函数柯里化 上面的api用的很多&#xff0c;所以都知道是干嘛的使用场景是什么&#xff0c;柯里化用得并不多&#xff0c;所以想手撕之前还是先了解一下它的意义以及用处 什么是柯里化 柯里化Currying又称部分求值&#xff0c;是高阶函数的一种&#xff0c;通常只需要把一部分…

【5G PHY】5G NR 如何计算资源块的数量?

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【像素画板】游戏地图编辑器-uniapp项目开发流程详解

嘿&#xff0c;用过像素画板没有哦&#xff0c;相信喜欢绘画的小朋友会对它感兴趣呢&#xff0c;用来绘制像素画非常好看&#xff0c;有没有发现&#xff0c;它是可以用来绘制游戏地图的&#xff0c;是不是很好奇&#xff0c;来一起看看吧。 像素画板&#xff0c;也叫像素画的绘…

C++基础 -34- 输入输出运算符重载

输出运算符重载格式 ostream & operator<<(ostream &out,person a) {cout << a.a << endl;return out; }举例输出运算符重载 #include "iostream"using namespace std;class person {public:person(int a):a(a){}int a; };ostream &…

Go 语言中的反射机制

欢迎大家到我的博客浏览&#xff0c;更好的阅读体验请点击 反射 | YinKais Blog 反射在大多数的应用和服务中并不常见&#xff0c;但是很多框架都依赖 Go 语言的反射机制简化代码。<!--more-->因为 Go 语言的语法元素很少、设计简单&#xff0c;所以它没有特别强的表达能…

51. N 皇后

题目介绍 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案…

一文讲透Python函数的创建和调用

1.Python提供了函数作为完成某项工作的标准化代码块 Python本质上是一种编程语言&#xff0c;通过编写运行代码的方式实现工作目标。读者可以想象&#xff0c;如果针对机器学习或数据统计分析的每种方法或统计量计算都要用户自行编写代码&#xff0c;那么显然在很多情况下是无…

一款充电桩解决方案设计

一、基本的概述 项目由IP6536提供两路5V 1.5A 的USB充电口&#xff0c;IP6505提供一路最大24W的USB快充口支持QC3.0 / DCP / QC2.0 / MTK PE1.1 / PE2.0 / FCP / SCP / AFC / SFCP的快充协议&#xff0c;电池充电由type-C输入经过IP2326输出最高15W快充对电池进行充电&#xf…

VSCode 中将头文件和头文件函数分离,编译主函数跳出 undefined reference to 的问题解决

VSCode 编写 C &#xff08;.h&#xff0c;.cpp 文件分离&#xff09;代码&#xff0c;编写完成后&#xff0c;编译遇到了编译错误 undefined reference to xxx。 开始还以为使用了 -stdc20 而不能使用 #include “xxx.h" 方式头文件&#xff0c;但仔细一想虽然引入了 im…

18487.1 - 2015 电动汽车充电系统标准 第1部分 关键点梳理

一、部分知识介绍 1、连接方式 使用电缆和连接器将电动汽车接入电网&#xff08;电源&#xff09;的方法。 1.1、连接方式A 1.2、连接方式B 1.3、连接方式C 2、电动汽车控电设备 2.1、按照输出电压分类 1&#xff09;交流 单相 220V&#xff0c;三相 380V. 2&#xff09…