我正在实现一个活动可以通过绑定访问的绑定服务。我调用服务的方法来访问特定的值。该服务每隔30毫秒获取一次值更新,并使用Timer.scheduleAtFixedRate调用update方法。
我期望通过绑定,服务的更新值将被推送到活动并导致仅使用一次调用自动更新我的活动值;但这种情况并非如此。
或者,我将服务方法调用放在runnable类中,并使用Handler对象发布它。但是,即便如此,值也不会更新。
连接onCreate():
mConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Toast.makeText(context, "Service is connected", Toast.LENGTH_SHORT).show();
LocalBinder binder = (LocalBinder) service;
gyroService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Toast.makeText(context, "Service is disconnected", Toast.LENGTH_SHORT).show();
mBound = false;
}
};
这是我的活动方法的onStart绑定。
@Override
protected void onStart() {
super.onStart();
// Bind to LocalService
Intent gyroIntent = new Intent(this, GyroFusionService.class);
Bundle bundle = new Bundle();
bundle.putString("activity", "calibration");
gyroIntent.putExtras (bundle);
bindService(gyroIntent, mConnection, Context.BIND_AUTO_CREATE);
}
这是我使用处理程序调用的可运行对象:
private Runnable updateTiltTask = new Runnable() {
public void run() {
if (mBound) {
// Call a method from the LocalService.
// However, if this call were something that might hang, then this request should
// occur in a separate thread to avoid slowing down the activity performance.
calibValues = ((GyroFusionService) gyroService).getCalibArray();
baseValues = ((GyroFusionService) gyroService).getBaseArray();
updateOrientationDisplay(); // on click, update the textView values
// Toast.makeText(context, "received both arrays", Toast.LENGTH_SHORT).show();
}
else
mPitchView.setText("Please wait. Service is not connected yet.");
}
};
我知道计划的计时器正在运行,因为点击我的活动类中的按钮,我可以从服务中获取更新的值,但我不知道如何从我的服务类调用或接收值更新定期。
我的问题可归纳为:
Q1:从绑定服务获取价值更新的现有机制是什么? Q2:从服务中获取或从活动中获取是否更有效地从绑定服务接收值更新? - 在这种情况下传感器更新?
感谢您的时间=)
答案 0 :(得分:0)
Q1:对于本地绑定服务,活动可以在活动想要通信时直接调用服务上的方法。如果服务需要与活动进行通信,则可以使用带有信使的Handler。
Q2。在你的情况下,我认为服务的推动策略更合适。