Service 是 Android 系统的服务组件,适用于开发没有用户界面且长时间在后台运行的功能。通过本次试验了解后台服务的基本原理,掌握本地服务的使用方法。
1、创建一个Service服务用来完成简单的求和和比较大小的数学运算。
2、创建Activity并调用该数学Service
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一个数:">
</TextView>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:id="@+id/firstnum"
android:inputType="number"
android:digits="1234567890.">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二个数"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:id="@+id/second"
android:inputType="number"
android:digits="1234567890."/>
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bind"
android:text="绑定"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/add"
android:text="求和"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/compare"
android:text="比较大小"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/unbind"
android:text="解除绑定"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/out"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
MathService.java
package com.example.serviceexperiment;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;
public class MathService extends Service {
//服务绑定
final IBinder mBinder=new LocalBinder();
public class LocalBinder extends Binder {
MathService getService() {
return MathService.this;
}
}
public MathService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return mBinder;
}
public boolean onUnbind(Intent intent){
Toast.makeText(this,"取消本地绑定",Toast.LENGTH_SHORT).show();
return false;
}
public Double Add(Double a,Double b){
return a+b;
}
public boolean Compare(Double a,Double b){
if(a>b){
return true;
};
return false;
}
}
MainActicity.java
package com.example.serviceexperiment;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private MathService mathService;
private boolean isBound=false;
TextView labelView;
EditText firstnum;
EditText secondnum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
labelView=(TextView)findViewById(R.id.out);
labelView.setText("两个数默认值都为0");
firstnum=(EditText)findViewById(R.id.firstnum);
secondnum=(EditText)findViewById(R.id.second);
Button bindButton=(Button)findViewById(R.id.bind);
Button unbindButton=(Button)findViewById(R.id.unbind);
Button addButton=(Button)findViewById(R.id.add);
Button compareButton=(Button)findViewById(R.id.compare);
bindButton.setOnClickListener(new View.OnClickListener() {//绑定按钮
@Override
public void onClick(View view) {
if(!isBound){
final Intent serviceIntent=new Intent(MainActivity.this,MathService.class);
bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE);
isBound=true;
Toast.makeText(MainActivity.this,"本地绑定:MathService",Toast.LENGTH_SHORT).show();
}
}
});
unbindButton.setOnClickListener(new View.OnClickListener() {//解绑按钮
@Override
public void onClick(View view) {
if(isBound){
isBound=false;
unbindService(mConnection);
mathService=null;
Toast.makeText(MainActivity.this,"取消本地绑定:MathService",Toast.LENGTH_SHORT).show();
}
}
});
addButton.setOnClickListener(new View.OnClickListener() {//调用服务加法
@Override
public void onClick(View view) {
if(mathService==null){
Toast.makeText(MainActivity.this,"未绑定服务:MathService",Toast.LENGTH_SHORT).show();
return;
}
String firsttext=firstnum.getText().toString();
Double a= 0.0;
if(firsttext.length()!=0){
a=Double.parseDouble(firsttext);
}
String secondtext=secondnum.getText().toString();
Double b= 0.0;
if(secondtext.length()!=0){
b=Double.parseDouble(secondtext);
}
Double result=mathService.Add(a,b);
String msg=String.valueOf(a)+"+"+String.valueOf(b)+"="+String.valueOf(result);
labelView.setText(msg);
}
});
compareButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mathService==null){
Toast.makeText(MainActivity.this,"未绑定服务:MathService",Toast.LENGTH_SHORT).show();
return;
}
String firsttext=firstnum.getText().toString();
Double a= 0.0;
if(firsttext.length()!=0){
a=Double.parseDouble(firsttext);
}
String secondtext=secondnum.getText().toString();
Double b= 0.0;
if(secondtext.length()!=0){
b=Double.parseDouble(secondtext);
}
boolean result=mathService.Compare(a,b);
String msg;
if(result){
msg=String.valueOf(a)+"和"+String.valueOf(b)+"中最大的数是"+String.valueOf(a);
}else{
msg=String.valueOf(a)+"和"+String.valueOf(b)+"中最大的数是"+String.valueOf(b);
}
labelView.setText(msg);
}
});
}
private ServiceConnection mConnection=new ServiceConnection() {//绑定
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mathService=((MathService.LocalBinder)iBinder).getService();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mathService=null;
}
};
}
AndroidMainfest.xml中加入
<service
android:name=".MathService"
android:enabled="true"
android:exported="true"></service>