Android привязывает сервис к собственному классу - PullRequest
0 голосов
/ 23 октября 2011

Полагаю, у меня больше похожа проблема дизайна, чем проблема «как связать сервис». Я пытаюсь сделать так, чтобы служба работала в отдельном процессе, который обрабатывает связь через Bluetooth. Далее у меня есть несколько вкладок, внутри друг друга активности. События обработки и пользовательского интерфейса каждого действия приводят к простым командам, которые должны передаваться через Bluetooth, например, «вверх», «вниз», «влево» или «вправо». Поскольку результаты в каждой вкладке одинаковы, я не хочу связывать каждую из них со службой и использую один и тот же обработчик сообщений. Поэтому я создал свой собственный объект Handler и объект «коннектор». Однако я не уверен, как связать этот объект коннектора с моим сервисом, так как он требует контекста. Имеет ли смысл просто передавать контекст приложения моему объекту коннектора и связывать его таким образом ???

Я открыт для любых предложений или подсказок

Ответы [ 2 ]

0 голосов
/ 05 ноября 2011

Вот вы, мой пример .. поясню вам об этом LOL

// My MyServiceInterface.aidl
package com.mad.exam;
interface MyServiceInterface{
     int getNumber();
}

//MyService 
public class MyService extends Service {

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "Service OnBind()", Toast.LENGTH_LONG).show();
    return mBinder;
}

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    Toast.makeText(this, "Service Created", Toast.LENGTH_SHORT).show();
}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Toast.makeText(this, "Service Destroyed ", Toast.LENGTH_SHORT).show();
}

@Override
public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);
    Toast.makeText(this, "Service Started ", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onUnbind(Intent intent) {
    // TODO Auto-generated method stub
    return super.onUnbind(intent);
}

private final MyServiceInterface.Stub mBinder = new MyServiceInterface.Stub() {
    public int getNumber() {
        return new Random().nextInt(100);
    }
};
}


//My Activity 
public class ServiceDemo extends Activity implements OnClickListener {
MyServiceInterface mService;
ServiceConnection mConnection;
Button retreive;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.service);
    retreive = (Button) findViewById(R.id.retreive);
    retreive.setOnClickListener(this);

    mConnection = new ServiceConnection() {

        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub

            mService = MyServiceInterface.Stub.asInterface(service);

            try {
                int i;
                i = mService.getNumber();
                Toast.makeText(ServiceDemo.this, "The service value is: " + String.valueOf(i),
                        Toast.LENGTH_SHORT).show();
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };

}

public void onClick(View v) {
    // TODO Auto-generated method stub
    Log.i("My Tag", "Clicked");
    Button btn = (Button) v;
    Intent callService = new Intent(this, MyService.class);
    bindService(callService, mConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Intent callService = new Intent(this, MyService.class);
    bindService(callService, mConnection, Context.BIND_AUTO_CREATE);

}

}

0 голосов
/ 23 октября 2011

Я бы рекомендовал не использовать связывание в этом случае.На самом деле, я бы рекомендовал не связывать в большинстве случаев использования.Старайтесь обрабатывать все взаимодействия между вашими действиями и службой, работающей в другом потоке, используя только намерения.

Это означает: отправлять команды службе из действий с помощью метода .startActivity (), передавая сведения о фактическомКоманда в дополнениях Intent.

Получение событий и результатов от службы в ваших действиях динамически зарегистрированными BroadcastReceivers.Вы регистрируете слушателя в onResume () и отменяете его регистрацию в onPause () в своей активности.Служба отправляет материал только путем его трансляции (sendBroadcast ()).

Я предпочитаю эту архитектуру.Он слабо связан, и вы можете пропустить надоедливую часть, если вам интересно, правильно ли все ваши действия отсоединяются от вашего сервиса, когда они им не пользуются.Кроме того, вы пропускаете боль при использовании IPC, что, на мой взгляд, является огромным плюсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...