下面是别的实验的链接~ 需要的自取~~~~

​​实验二、Activity界面基本实验 ​​实验三、启动式service & 随机数 & 每两秒更新一次
实验五、广播实验
实验六、contentprovider实验+SQLite数据库的实现
实验七、fragment实验
实验八、综合实验MP3播放器

【实验名称】实验四、绑定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的工作原理与其生命周期

(请完成如下部分)

【实验设计】

【安卓实验】实验四、绑定service实验 & 加法函数add_ide

下面代码可运行还有一部分随机数的,读者自行取需要的叭

MainActivity.java

package com.example.test02;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
Button button;
Button button2;
Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Intent intent = new Intent(MainActivity.this,DetailActivity.class);
Intent intent = new Intent(MainActivity.this,DetailActivity.class);
intent.putExtra("data","学号:7 姓名: email:@qq.com");
startActivity(intent);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, RandomActivity.class);
startActivity(intent);
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,AddActivity.class);
startActivity(intent);
}
});

}

}

DetailActivity.java

package com.example.test02;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

public class DetailActivity extends Activity {
private SharedPreferences mSpf;
private TextView textView1;
private TextView textView2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);

textView1 = (TextView) findViewById(R.id.text1);
textView2 = (TextView) findViewById(R.id.text2);
//获取当前页面接受到的Intent
Intent intent = getIntent();
String msg = intent.getStringExtra("data");
textView1.setText(msg);
//返回按钮
Button button =(Button) findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
//SharedPreferences
mSpf = super.getSharedPreferences("test",MODE_PRIVATE);

}

public void writeInfo(View view) {
SharedPreferences.Editor editor = mSpf.edit();
editor.putString("info",textView1.getText().toString());
editor.commit();
//Toast.makeText(context,"you clicked button 1",Toast.LENGTH_SHORT).show();
}
public void readInfo(View view) {
String info = mSpf.getString("info","");
textView2.setText(info);
}

}

BindService2.java

package com.example.test02;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class BindService2 extends Service {
public BindService2() {
}

//创建内部类
public class MyBinder extends Binder{
public BindService2 getService(){
//创建获取service的方法
return BindService2.this; //返回当前service
}
}
@Override
public IBinder onBind(Intent intent) {
//返回MyBinder
return new MyBinder();
}

//自定义方法
public int getSum(int a,int b){
return a+b;
}

@Override
public void onDestroy() {
super.onDestroy();
}
}

AddActivity.java

package com.example.test02;

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;

import androidx.annotation.Nullable;

public class AddActivity extends Activity {
BindService2 binderService;
Button add_button;
TextView result;
EditText num_a;
EditText num_b;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
add_button = (Button) findViewById(R.id.add_button);
num_a = (EditText) findViewById(R.id.num_a);
num_b = (EditText) findViewById(R.id.num_b);
result =(TextView) findViewById(R.id.result);
add_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int numa = Integer.parseInt(num_a.getText().toString());
int numb = Integer.parseInt(num_b.getText().toString());
int num = binderService.getSum(numa,numb);
System.out.println(num);
String res = String.valueOf(num);
result.setText(res);
}
});
}

@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(AddActivity.this,BindService2.class);
bindService(intent,connection,BIND_AUTO_CREATE);
}
//创建connection对象
private ServiceConnection connection = new ServiceConnection() {

/**
* 绑定成功后通过getService()获取Service实例
* 这样便可以调用Service中的方法和属性
* @param componentName
* @param service
*/

@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
binderService =((BindService2.MyBinder)service).getService();
}

@Override
public void onServiceDisconnected(ComponentName componentName) {
binderService = null;
}
};


}

RandomActivity.java

package com.example.test02;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.Nullable;


public class RandomActivity extends Activity implements View.OnClickListener{

Button begin;
Button end;
TextView textView;
public static Handler handler;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.service_random);
begin = (Button) findViewById(R.id.begin);
end = (Button) findViewById(R.id.end);
//begin.setOnClickListener(this);
//end.setOnClickListener(this);
textView = (TextView) findViewById(R.id.randomnum);
//显示启动
final Intent startIntent = new Intent(RandomActivity.this,RandomService.class);
handler = new Handler(){
@Override
public void handleMessage(Message msg){
System.out.println(msg.what);
textView.setText(String.valueOf(msg.what));
}
};
}
private Intent intent;
@Override
public void onClick(View view) {
begin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("??");
intent = new Intent(RandomActivity.this,RandomService.class);
startService(intent);
}
});
end.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopService(intent);
}
});
//两种方式都可以
/* switch (view.getId()){
case R.id.begin:
System.out.println("??");
intent = new Intent(RandomActivity.this,RandomService.class);
startService(intent);
break;
case R.id.end:
stopService(intent);
break;
default:break;
}*/
}
}

RandomService.java

package com.example.test02;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Message;

public class RandomService extends Service {

private int random;
private boolean quit=true;

@Override
public void onCreate(){
super.onCreate();
System.out.println("start");
new Thread(){
@Override
public void run(){
while(quit){
random = (int)(Math.random()*100);
Message message = new Message();
message.what = random;
RandomActivity.handler.sendMessage(message);
// System.out.println(random);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId){
return super.onStartCommand(intent,flags,startId);
}

@Override
public void onDestroy(){
quit=false;
super.onDestroy();
System.out.println("stop");
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}

// private double randomNum;
// private Timer timer=null;
//
// @Nullable
// @Override
// public IBinder onBind(Intent intent) {
// return null;
// }
//
// @Override
// public void onCreate() {
// super.onCreate();
// }
//
// @Override
// public void onStart(Intent intent, int startId) {
// super.onStart(intent, startId);
//
// timer=new Timer();
// timer.schedule(new TimerTask() {
// @Override
// public void run() {
// // (1) 使用handler发送消息
// Message message=new Message();
// message.what=0;
// mHandler.sendMessage(message);
// }
// },0,1000);//每隔一秒使用handler发送一下消息,也就是每隔一秒执行一次,一直重复执行
// }
//
//
//
// // (2) 使用handler处理接收到的消息
// private Handler mHandler = new Handler(){
// @Override
// public void handleMessage(Message msg) {
// if(msg.what == 0){
// //这部分写要执行的函数
// randomNum = Math.random();
// System.out.println(randomNum);
// }
// }
// };
//
// @Override
// public void onDestroy() {
// super.onDestroy();
// //结束timer
// timer.cancel();
// timer = null;
// }

RandomService2.java

package com.example.test02;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import androidx.annotation.Nullable;

public class RandomService2 extends Service {

private Thread workThread;

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
System.out.println("onCreate");
//线程组,需要执行的Runnable对象,线程的名称
workThread = new Thread(null,backgroundWork,"WorkThread");
}

@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
if(!workThread.isAlive()){
System.out.println("onStart");
workThread.start();
}
}

@Override
public void onDestroy() {
super.onDestroy();
workThread.interrupt();
}

private Runnable backgroundWork = new Runnable() {
@Override
public void run() {
while(!Thread.interrupted()){
double random = Math.random();
RandomActivity2.UpdateGUI(random);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
}

activity_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".DetailActivity">

<TextView
android:id="@+id/text1"
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<Button
android:id="@+id/button2"
android:layout_marginLeft="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回上一页面" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="20dp">
<Button
android:id="@+id/input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="存储"
android:onClick="writeInfo"
/>
<Button
android:id="@+id/output"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取"
android:onClick="readInfo"
/>
</LinearLayout>

<TextView
android:id="@+id/text2"
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查看详细" />

<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="产生随机数页面"/>

<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="执行加法"/>

</LinearLayout>

add.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".AddActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="A: "/>

<EditText
android:id="@+id/num_a"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="" />


</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="B: "/>
<EditText
android:id="@+id/num_b"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="结果: "/>
<TextView
android:id="@+id/result"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="" />
</LinearLayout>

<Button
android:id="@+id/add_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"

android:text="计算" />

</LinearLayout>

random2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RandomActivity2">
<TextView
android:id="@+id/num_random2"
android:text="0"
android:textAlignment="center"
android:textSize="200dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal" />
<Button
android:id="@+id/start_random2"
android:text="start"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/stop_random2"
android:text="stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

service_random.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".RandomActivity">

<Button
android:id="@+id/begin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动"
/>
<Button
android:id="@+id/end"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="结束"
/>

<TextView
android:id="@+id/randomnum"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
android:textSize="200dp"
android:text="0"
/>
</LinearLayout>

【实验分析或心得】
充分理解Service的作用,与Activity之间的区别,掌握Service的生命周期以及对应函数,了解Service的主线程性质;掌握主线程的界面刷新的设计原则,掌握启动service的方式,及其工作原理。理解了绑定式Service。