链接: 大佬原文:我很好请走开谢谢.
【实验名称】实验三、启动式service
【实验目的】
充分理解Service的作用,与Activity之间的区别,掌握Service的生命周期以及对应函数,了解Service的主线程性质;掌握主线程的界面刷新的设计原则,掌握启动service的方式,及其工作原理;
【实验内容】
任务1:在service中实现随机数产生;
任务2:在Activity界面实现随机数的显示,并采用启动式完成service的启动;
【实验要求】
1、在service中实现随机数产生;
2、实现Service中的各个生命周期函数,并理解其功能;
2、在Activity界面实现随机数的显示,每2秒更新一次;
3、采用启动式完成service的启动;
(请完成如下部分)
【实验设计】
1、Main3Activity.java
通过启动式 创建Service,点击开始后调用Intent以显式 的方式调用:RandomService.Java。
当点击开始按钮时,调用startService(serviceIntent);方法启动service,
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.liu.myapplication01.R;
public class Main3Activity extends AppCompatActivity {
private static Handler handler = new Handler();
private static TextView labelView = null;
private static double randomDouble;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
labelView =(TextView) findViewById(R.id.randomname);
Button start =(Button) findViewById(R.id.startrandom);
Button stop =(Button) findViewById(R.id.stoprandom);
final Intent serviceIntent = new Intent(Main3Activity.this,RandomService.class);
start.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
startService(serviceIntent);
}
});
stop.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
stopService(serviceIntent);
}
});
}
public static void UpdateGUI(double refreshDouble){
randomDouble = refreshDouble;
handler.post(RefreshLable);
}
private static Runnable RefreshLable = new Runnable() {
@Override
public void run() {
labelView.setText(String.valueOf(randomDouble));
}
};
}
2、RandomService.java
调用进程:workThread = new Thread(null,backgroundWork,"WorkThread"); 以2000ms为周期生成随机数 调用其中使用方法:UpdateGUI() 将生成的随机数抛到Lopper队列中,直到Runnable对象中的 run() 方法被调用,从而使随机数 回显到原来的文本框中。
public class RandomService 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() {
try {
while(!Thread.interrupted()){
double random = Math.random();
System.out.println(random);
Main3Activity.UpdateGUI(random);
Thread.sleep(2000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}
3、activity_main3.xml
android:layout_width="379dp" android:layout_height="35dp">
【实验结果】
虚拟机:
【实验分析或心得】
·service的作用:在后台完成用户指定的操作
·包括两种状态:
·启动状态,startService()启动,可在后台无期限运行,手动调用才能停止
·绑定状态, bindService() 与其他组件绑定后开始运行
·service 与Activity的区别:
·Activity和Service的生命周期不一样,Activity处在哪个生命周期是由系统控制的,service是由程序控制的,service不能自己启动,而且service不与用户交互。



