Android实验:绑定service实验

news2025/1/8 5:02:46

目录

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

实验目的

充分理解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。

结果展示

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

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

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

相关文章

JavaWeb 前端工程化

前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。 前端工程化实现技术栈 前端工程化实现的技术栈有很多,我们采用ES6nodejsnpmViteVUE3routerpiniaaxiosElement-plus组合来实现 ECMAScri…

游戏被流量攻击会有什么样的影响,该用什么样的防护方式去处理

德迅云安全-领先云安全服务与解决方案提供商德迅云游戏盾专门针对游戏进行防护&#xff0c;可免费提供防护方案~ 如果游戏被流量攻击会产生以下影响&#xff1a; 服务器过载&#xff1a;流量攻击会导致游戏服务器接收到的请求数量急剧增加&#xff0c;超出服务器的处理能力。这…

Reactor实战,创建一个简单的单线程Reactor(理解了就相当于理解了多线程的Reactor)

单线程Reactor package org.example.utils.echo.single;import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.*; import java.util.Iterator; import java.util.Set;public class EchoServerReactor implements Runnable{Selector sele…

Python中PyQt5可视化界面通过拖拽来上传文件

注&#xff1a;这个窗口提供了一个快速上传文件的小tips&#xff0c;如果需要对上传的文件进行进一步处理的可以在“processFiles”函数或者编写其它函数进行扩充就可以。 1、需要安装模块 pip install PyQt5 2、运行效果 1、通过拖拽的方式上传需要的文件到窗口&#xff0c;会…

【灵魂 |数据结构与算法】 数据结构必备经法(开山篇),一起修炼算法经法!

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

微信小程序引入node_modules依赖

微信小程序不支持直接读取node_modules 首先在目录文件夹下cmd输入npm init命令 D:\小程序\project\calendar\calendar_1>npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible…

巧用乖离率BIAS,捕捉买卖信号

一、认识BIAS乖离率 BIAS&#xff0c;中文名称是乖离率&#xff0c;它表示一定时期内股价与其MA均线的偏离程度。这个指标的理论基础是如果股价偏离均线太远&#xff0c;不管股价在均线之上还是在均线之下&#xff0c;它最终都会向均线靠拢。 乖离率&#xff08;当日收盘价-N日…

德国进口高速主轴电机在机器人上的应用及选型方案

随着机器人技术的日新月异&#xff0c;高速主轴电机在机器人领域的应用也日趋广泛。德国进口的SycoTec高速主轴电机&#xff0c;以其高转速、高精度、高刚度的特点&#xff0c;在机器人的切割、铣削、钻孔、去毛刺等加工应用中发挥着关键作用。 一、高速主轴电机的特点 SycoT…

外汇天眼:想像巴菲特那样纵横市场?那你和他之间就差个它...

在金融市场上&#xff0c;有些人以巴菲特为榜样&#xff0c;希望像他一样纵横市场&#xff0c;成为投资大师。然而大多数人只是看到了巴菲特表面的成功&#xff0c;却忽视了他在投资过程中所付出的努力和智慧。实际上&#xff0c;如果你想成为像巴菲特那样的投资者&#xff0c;…

PPT NO.5 科研绘图常用操作快捷键

1、Ctrl键 ①按住Ctrl键&#xff0c;可以跳选多个对象&#xff1a; ②按住Ctrl键&#xff0c;同时拖动对象即可进行复制&#xff1a; ③按住Ctrl键&#xff0c;可以对对象进行中心放大或中心缩小&#xff1a; 2、Shift键 ①按住Shift键&#xff0c;拖动对象只能水平或垂直移动…

本地存储与复杂数据类型转换

1. 本地存储介绍 2.1 本地存储分类 - localStorage // 存储一个名字localStorage.setItem(uname, abc)// 获取名字console.log(localStorage.getItem(uname));// 删除本地存储 只删名字// localStorage.removeItem(uname)// 改localStorage.setItem(uname, aaa)// 存一个年龄 …

使用Linux docker方式快速安装Plik并结合内网穿透实现公网访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

ApachePOI入门案例——向Excel文件写入内容

依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version> </dependency> <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml…

无人机智慧工地:助力工地管理的未来之选

在现代工地管理中&#xff0c;无人机凭借其小巧、轻便和多角度拍摄等特点得到广泛应用&#xff0c;尤其在智慧工地的现场管理中发挥着重要作用。 一、无人机代替人工巡检省时省力 以往&#xff0c;施工现场检查主要依赖人工巡检方式&#xff0c;需要较长时间。而现在&#xff…

2312skia,skia简单绘画

#include <常用> #undef max #undef min //#include <ios> #include "亚定义" #include "sk0.cpp" 空 gg(亚画布&c){亚笔 p;p.置颜色(亚红色);亚字体 f;f.置大小(64);f.置字体(亚字族::从名造("楷体",亚字体风格::Normal()));//…

Golang使用Swagger文档教程

Golang开发效率是杠杠滴&#xff0c;简单几行代码就可完成一个可用的服务&#xff0c;如下代码&#xff1a; 采用Gin作为web framework采用Gorm作为持久化ORM采用Swagger作为OpenAPI文档管理工具 package mainimport ("encoding/csv""fmt""os"…

【AI读论文】CAAFE:基于大模型的自动特征工程

Title&#xff1a;Large Language Models for Automated Data Science: Introducing CAAFE for Context-Aware Automated Feature Engineering Paper: https://arxiv.org/pdf/2305.03403.pdf GitHub: https://github.com/automl/CAAFE PS&#xff1a;该论文已被NeurIPS 2023接收…

Windows系列:Windows的13个版本以及 Windows Server详解(配置)

Windows的13个版本以及 Windows Server详解&#xff08;配置&#xff09; 一. Windows的13个版本的区别&#xff0c;企业版、教育版、专业版、工作站版、SE版的主要区别家庭版专业版教育版企业版Servers版 二. Windows Server VS Windows&#xff0c;两者有啥区别&#xff1f;什…

ASP.NET 网上选课系统的设计与实现

1 系统设计与实现 1.1 数据库设计 为充分保护数据的一致性&#xff0c;数据库中各表都规范化设计&#xff0c;下图是系统数据库中使用的表以及各表之间的关系&#xff1a; 下面就各个表分别给出说明&#xff1a; (1)课程基本信息&#xff08;CourseInfo&#xff09;表&#x…

Typora免费版安装教程(仅供学习)

目录 一、Typora简介二、Typora安装三、Typora补丁四、Typora使用体验五、总结 一、Typora简介 Typora是一款非常流行的Markdown编辑器&#xff0c;它能够将Markdown文本转化为漂亮的排版&#xff0c;并且支持实时预览。Typora具有简单易用的界面&#xff0c;使得用户可以轻松地…