Android 实验十一 Service 1、Service的创建和使用2、Service的配置

本文详细描述了如何在Android中创建和使用CalculatorService,包括Service的创建、配置、绑定到Activity进行交互,以及处理生命周期方法和IPC。通过实例展示了如何在MainActivity中绑定、解绑Service并调用其计算方法。
摘要由CSDN通过智能技术生成

一、实验目的及任务

1、Service的创建和使用

2、Service的配置

二、实验环境

  1. Jdk
  2. Android Studio

三、实验步骤

编写一个Service类,里面有求一个1~n之和的方法。

编写一个Activity类,里面有绑定、解除绑定、输入一个上届数字n的输入框、计算和的按钮、显示结果的输入框。

当单击绑定按钮时,绑定启动Service;

当单击解除绑定按钮时解除与Service的绑定;

输入完上界数字后,当单击求和按钮时,调用Service的求和方法,并将结果显示到显示结果的输入框中;

四、实验报告

写出源代码,包括Service的代码、在AndroidManifest.xml文件中配置的代码、Activity的代码、布局文件的代码。

写出实验过程中出现的问题以及你的解决方法。

思路:

  • 创建一个CalculatorService类,继承自Service类。
  • 在CalculatorService类中,定义一个内部类MyBinder,继承自Binder类,并提供一个getService方法,返回CalculatorService的实例。
  • 在CalculatorService类中,重写onBind方法,返回MyBinder的实例。
  • 在CalculatorService类中,定义一个getSum方法,接受一个整数n作为参数,返回1到n的和。
  • 在CalculatorService类中,重写onCreate,onUnbind和onDestroy方法,根据需要添加逻辑。
  • 在AndroidManifest.xml文件中,注册CalculatorService类,指定其名称和intent-filter。

编写一个Activity类,里面有绑定、解除绑定、输入一个上届数字n的输入框、计算和的按钮、显示结果的输入框:

  • 创建一个MainActivity类,继承自AppCompatActivity类,并实现View.OnClickListener接口。
  • 在MainActivity类中,重写onCreate方法,设置布局文件,并获取各个控件的引用。
  • 在MainActivity类中,定义一个ServiceConnection对象,重写onServiceConnected和onServiceDisconnected方法,用于绑定和解绑Service。
  • 在MainActivity类中,重写onClick方法,根据不同的控件id,执行相应的逻辑,如绑定或解绑Service,获取输入的数字,调用Service的getSum方法,显示结果等。
  • 在布局文件中,定义一个LinearLayout,包含五个Button和两个EditText,分别用于绑定、解除绑定、输入上界数字、计算和、显示结果。为每个Button设置id和text属性,为每个EditText设置id属性。
  • 这是一个CalculatorService.java文件
    package com.example.ch11;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    
    public class CalculatorService extends Service {
        class MyBinder extends Binder {
            CalculatorService getService(){
                return CalculatorService.this;
            }
        }
        MyBinder binder = new MyBinder();
        @Override
        public IBinder onBind(Intent intent){
            return binder;
        }
        public CalculatorService(){
            super();
        }
        public void onCreate(){
            super.onCreate();
        }
        public boolean onUnbind(Intent intent){
            return true;
        }
        public void onDestroy() {
            super.onDestroy();
        }
        //业务逻辑
        public int getSum(int n){
            int sum=0;
            for(int i=1;i<=n;i++){
                sum += i;
            }
            return sum;
        }
    }
    
    
    

    这是一个MainActivity.java文件

    package com.example.ch11;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.annotation.SuppressLint;
    import android.app.Service;
    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.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        EditText maxNum, dasRes;
        CalculatorService.MyBinder binder;//CalculatorService中的MyBinder内部类
        CalculatorService service;
        @SuppressLint("MissingInflatedId")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            maxNum = findViewById(R.id.maxNum);
            dasRes = findViewById(R.id.dasRes);
            //为各个按钮设置监听器
            findViewById(R.id.btnStart).setOnClickListener(this);
            findViewById(R.id.btnStop).setOnClickListener(this);
            findViewById(R.id.btnShow).setOnClickListener(this);
        }
        //属性, 相当于javaweb JDBC中的connection连接对象
        public ServiceConnection connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                binder = (CalculatorService.MyBinder)iBinder;
                service = binder.getService();
                System.out.println("Connect");
            }
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                System.out.println("Disconnect");
            }
        };
        //onclick: 用于启动后台Service服务
        public void StartService(View view){
            Intent intent = new Intent(this, CalculatorService.class);
            intent.setAction("1");
            bindService(intent, connection, Service.BIND_AUTO_CREATE);
            Toast.makeText(this,"绑定成功",Toast.LENGTH_LONG).show();
        }
        //onclick: 用于停止后天的Service服务
        public void StopService(View view){
            unbindService(connection);
            Toast.makeText(this,"解除绑定",Toast.LENGTH_LONG).show();
        }
        //onclick: 用于显示计算结果数字的 (其实计算也就是在这一步发生的)
        public void ShowResult(View view){
            if (maxNum.getText().toString().length() == 0) return;
            int result = service.getSum(Integer.parseInt(maxNum.getText().toString()));
            dasRes.setText(String.valueOf(result));
            Toast.makeText(this,"计算成功",Toast.LENGTH_LONG).show();
        }
        @Override
        public void onClick(View v) {
            int id = v.getId();
            if (id == R.id.btnStart){
                StartService(v);
            } else if (id == R.id.btnStop){
                StopService(v);
            } else if (id == R.id.btnShow){
                ShowResult(v);
            }
        }
    
    }
    

    这是一个xml布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/btnStart"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="绑定" />
    
        <Button
            android:id="@+id/btnStop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="解除绑定" />
    
        <EditText
            android:id="@+id/maxNum"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入上界数字" />
    
        <Button
            android:id="@+id/btnShow"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="求和" />
    
        <EditText
            android:id="@+id/dasRes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="显示结果" />
    
    </LinearLayout>
    

    然后需要在AndroidManifest.xml注册,重点是这段代码:

  • <service
                android:name=".CalculatorService"
                android:enabled="true"
                android:exported="true" >
                <intent-filter>
                    <action android:name="com.example.CALCULATOR_SERVICE" />
                </intent-filter>
            </service>

  • <?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.Ch11"
            tools:targetApi="31">
            <activity
                android:name=".MainActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <service
                android:name=".CalculatorService"
                android:enabled="true"
                android:exported="true" >
                <intent-filter>
                    <action android:name="com.example.CALCULATOR_SERVICE" />
                </intent-filter>
            </service>
    
        </application>
    
    </manifest>

    五、实验总结

    此实验是安卓Service实验。Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。如要创建服务,必须创建 Service 的子类(或使用它的一个现有子类)。在实现中,必须重写一些回调方法,从而处理服务生命周期的某些关键方面,并提供一种机制将组件绑定到服务(如适用)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值