一、实验目的及任务
1、Service的创建和使用
2、Service的配置
二、实验环境
- Jdk
- 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 的子类(或使用它的一个现有子类)。在实现中,必须重写一些回调方法,从而处理服务生命周期的某些关键方面,并提供一种机制将组件绑定到服务(如适用)。