当前位置: 首页 > news >正文

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;@Overrideprotected 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() {@Overridepublic 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));}}});}@Overrideprotected void onStart() {super.onStart();Intent intent = new Intent(this, AdditionService.class);bindService(intent, serviceConnection, BIND_AUTO_CREATE);}@Overrideprotected void onStop() {super.onStop();if (isBound) {unbindService(serviceConnection);isBound = false;}}private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {AdditionService.LocalBinder binder = (AdditionService.LocalBinder) service;additionService = binder.getService();isBound = true;}@Overridepublic 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;}}@Overridepublic 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"><EditTextandroid:id="@+id/et_num1"android:layout_width="match_parent"android:layout_height="48dp"android:hint="请输入第一个数字"android:inputType="number" /><EditTextandroid:id="@+id/et_num2"android:layout_width="match_parent"android:layout_height="48dp"android:hint="请输入第二个数字"android:inputType="number" /><Buttonandroid:id="@+id/btn_calculate"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="计算" /><TextViewandroid: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"><applicationandroid: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"><activityandroid: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.lryc.cn/news/255758.html

相关文章:

  • K8S集群优化的可执行优化
  • Remix IDE 快速开始Starknet
  • SQL中limit与分页的结合
  • KALI LINUX信息收集
  • 联想电脑重装系统Win10步骤和详细教程
  • PET(Point-Query Quadtree for Crowd Counting, Localization, and More)
  • NgRx中dynamic reducer的原理和用法?
  • 麒麟V10服务器安装Apache+PHP
  • DOS 批处理 (一)
  • P1047 [NOIP2005 普及组] 校门外的树题解
  • pip的常用命令
  • 力扣面试题 08.12. 八皇后(java回溯解法)
  • 2023年第十二届数学建模国际赛小美赛A题太阳黑子预测求解分析
  • jsp 分页查询展示,实现按 上一页或下一页实现用ajax刷新内容
  • 基于ssm在线云音乐系统的设计与实现论文
  • 简谈PostgreSQL的wal_level=logic
  • 自动化巡检实现方法 (一)------- 思路概述
  • mysql获取时间异常
  • 维基百科文章爬虫和聚类:高级聚类和可视化
  • springboot智慧导诊系统源码:根据患者症状匹配挂号科室
  • Shell脚本如何使用 for 循环、while 循环、break 跳出循环和 continue 结束本次循环
  • n个人排成一圈,数数123离队
  • 深度学习基础回顾
  • 【Vue】修改组件样式并动态添加样式
  • GO设计模式——12、外观模式(结构型)
  • 一.初始typescript
  • mp3的播放
  • mixamo根动画导入UE5问题:滑铲
  • 容器资源视图隔离 —— 筑梦之路
  • 浅析嵌入式GUI框架-LVGL