android - 绑定Service,监听主Activity中服务的变量变化
问题描述
我正在尝试使用 Android 的加速度计测试一个简单的服务,但我不确定从这里去哪里。我想要它做的是使用服务检测运动,并让主要活动检测每次服务中的布尔变量“移动”发生变化时。
这里没有显示我的清单,我已经在其中输入了服务代码。
这是我的主要活动。
public class MainActivity extends AppCompatActivity {
private boolean mBound = false;
private accelService mService = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, accelService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
accelService.LocalBinder binder = (accelService.LocalBinder) service;
mService = binder.getService();
showMessage("Service Bound");
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
private void showMessage(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
}
这是我的服务。
public class accelService extends Service implements SensorEventListener {
private boolean moving = false;
private final IBinder mBinder = new LocalBinder();
private SensorManager sensorManager;
public int onStartCommand(Intent intent, int flags, int startId) {
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
SensorManager.SENSOR_DELAY_NORMAL);
return START_STICKY;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
setMoving(true);
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
class LocalBinder extends Binder {
accelService getService() {
return accelService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
解决方案
您已经有了 MainActivity 可以调用的“getService()”,对吧?好的。您必须在充当回调的 Service 类中创建一个新接口:
class accelService extends Service {
interface myCallback {
void onCalled(int parameter);
}
}
然后在“LocalBinder”中添加一个新方法和一个变量:
class LocalBinder extends Binder {
private myCallback mListener = null;
accelService getService() {....} //<!-- the one you already have
void addListener(myCallback listener) { //<!-- the new one that sets the listener/callback
myCallback = listener;
}
}
此时,您可以从 MainActivity 调用:
binder.addListener(new myCallback(){
Toast.makeText(context, "Test", Toast.LONG).show()
});
就像使用“getService()”一样。
最后你必须打电话
mBinder.onCalled(123456789)
在服务中的某个地方执行 Toast...show() 过程。通过这种方式,您可以将变量从 Service 传递到 MainActivity,而最后一个绑定到 Service。
推荐阅读
- c++ - gdb ptype 打印整数后缀以表明它是有符号、无符号、无符号长等
- java - 如何在不同主机中的 docker 容器之间设置 Java RMI RMI 连接
- javascript - 为什么对象方法后面有逗号分隔符?
- spring-boot - 保持操作顺序的同步spring webflux调用
- excel - VBA for循环添加空白字典条目
- dart - 在 StreamBuilder 中加载数据时如何显示进度指示器?
- salesforce - 优化查询以检索 100 天前创建的记录
- google-play - 可在应用内获取的 Google Play 商店评论标识符
- javascript - Javascript 正则表达式 /^(19|20)([0-9]{2})-([0-9]{2}|0[0-9]{1})-([0-9]{2} |0[0-9]{1})$/g 没有找到日期作为输入值
- java - 如何将 Scala 转换导出到 Java