【发布时间】:2021-10-17 11:09:08
【问题描述】:
我正在尝试从手机中读取传感器数据。我已经启动了一个服务,它创建了一个 HandlerThread 来收集传感器数据。线程注册传感器一小会儿然后取消注册。但是,当我停止服务时,线程会继续运行,并且我看到打印语句正在工作。我该如何阻止这个?这是我的服务代码。
package com.example.myapplication;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.provider.Settings;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
@RequiresApi(api = Build.VERSION_CODES.O)
public class SenseService extends Service {
private Looper serviceLooper;
private ServiceHandler serviceHandler;
private Context context;
private HandlerThread thread;
private final class ServiceHandler extends Handler implements SensorEventListener {
private SensorManager sensorManager;
private Sensor mLight;
private LocalDateTime currTime;
private String senseTime;
private String FILENAME="sensordata";
private FileOutputStream fos;
public ServiceHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
try {
currTime = java.time.LocalDateTime.now();
String newFileName = currTime.toString()+FILENAME+".csv";
fos = openFileOutput(newFileName, Context.MODE_APPEND);
} catch (FileNotFoundException e) {
System.out.println("did not open file");
e.printStackTrace();
}
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
try {
do {
sensorManager.registerListener(this, mLight, 10000000);
Thread.sleep(2000);
System.out.println("thread sleeping");
sensorManager.unregisterListener(this);
Thread.sleep(5000);
} while (true);
}catch (InterruptedException e) {
e.printStackTrace();
} {
}
stopSelf(msg.arg1);
}
@Override
public void onSensorChanged(SensorEvent event) {
float lux = event.values[0];
String val = Float.toString(lux);
senseTime = java.time.LocalDateTime.now().toString();
System.out.println(Float.toString(lux));
val = senseTime+","+val+"\n";
try {
fos.write(val.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
@Override
public void onCreate(){
thread = new HandlerThread("ServiceStartArguments");
thread.start();
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(serviceLooper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
Message msg = serviceHandler.obtainMessage();
msg.arg1 = startId;
serviceHandler.sendMessage(msg);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
System.out.println("Stopping service");
thread.quitSafely();
stopSelf();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
【问题讨论】:
-
这能回答你的问题吗? stop service in android
-
单击按钮时服务停止。我看到了祝酒词。但是在服务中启动的HandlerThread,它一直在运行。我在 onDestroy() 中添加了 thread.quitSafely() 但这不起作用
-
您是如何尝试停止服务的?
-
我使用 stopService() 停止服务:我有两个按钮,启动和停止。 onClick 停止并调用 stopService()
stopService( serviceIntent);
标签: android service android-handlerthread