实验目的

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

实验内容

  1. service中实现一个加法函数addint xint 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"?&gt;
<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"&gt;

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


    <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

结果展示

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

原文地址:https://blog.csdn.net/m0_72471315/article/details/134765131

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_38318.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注