我正在设计一个小型Android应用程序,我希望注册两个侦听器,一个用于位置更改,另一个用于来自我服务的onStartCommand的传感器事件。
我希望两个监听器同时工作,我已经在两个独立的处理程序中启动了监听器,但令我惊讶的是只有一个监听器正在工作。
我是android的新手,任何人都可以给我一些关于如何从一个Android服务注册到不同类型的监听器的见解。
以下是代码段。
@覆盖 public int onStartCommand(Intent intent,int flags,int startId){
Toast.makeText(getBaseContext(), "Service Started", Toast.LENGTH_SHORT).show();
runnableSpeed = new Runnable() {
public void run() {
startLocationListener();
}
};
handlerSpeed.postDelayed(runnableSpeed, 1000);
runnableGForce = new Runnable() {
public void run() {
startAccelerometerListener();
}
};
handlerGForce.postDelayed(runnableGForce, 1000);
return START_STICKY;
}
private void startLocationListener(){
Toast.makeText(getBaseContext(), "Location: Thread Name" + Thread.currentThread().getName(), Toast.LENGTH_SHORT).show();
locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
try {
gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
}
try {
network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) {
}
Log.v("Debug", "in on create.. 2");
if (network_enabled) {
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
Log.v("Debug", "Disabled..");
}
if (gps_enabled) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
Log.v("Debug", "Enabled..");
}
Log.v("Debug", "in on create..3");
}
private void startAccelerometerListener() {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(acceleromterListener, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
}
如果我运行任何一个监听器,它们都可以单独工作,但当我同时运行它们时,只会调用传感器事件。
此外,当我打印当前线程名称时,它总是显示主线程,认为两个侦听器都是分别注册的。