首页 > 解决方案 > 绑定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;
    }

}

标签: androidvariablesservicebindinglistener

解决方案


您已经有了 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。


推荐阅读