Служба привязки и прослушивание изменений в службе в основной деятельности - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь протестировать простой сервис с помощью акселерометра 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;
    }

}

1 Ответ

0 голосов
/ 07 декабря 2018

У вас уже есть getService (), который MainActivity может вызывать, верно?Хорошо.Вы должны создать новый интерфейс в классе 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.

...