Код привязки локальной службы от активности к услуге - PullRequest
1 голос
/ 08 декабря 2011

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

т.е. в основном пытается объединить код во втором блоке здесь в первый блок = как можно больше его в класс обслуживания

Одна строка в действии для привязки к услуге

public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // Bind to service with this line only:
    AService.bindService(this);
}
}

Статические bindService и ServiceConnection перемещены в службу

public class AService extends Service {

public String test = "I want to see this";
public static AService aService;
private static boolean isBound;
private static Context context;

// ... IBinder, onBind etc also here on service side

public static void bindService(Context context) {
    try {
        Log.i(TAG, "bindService Start");
        if (!isBound && context != null) {
            Log.i(TAG, "Binding");
            context.bindService(new Intent(context, AService.class),
                    serviceConnection, Context.BIND_AUTO_CREATE);
            isBound = true;
            Log.i(TAG, "Bound");
        }
    } catch (Exception e) {
        Log.e(TAG, "bindService", e);
    }
}

private static ServiceConnection serviceConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        try {
            Log.i(TAG, "onServiceConnected Start");
            aService = ((AService.LocalBinder) service).getService();
            if (aService != null)
                Log.i(TAG, aService.test);
            Log.i(TAG, "onServiceConnected Finish");
        } catch (Exception e) {
            Log.e(TAG, "onServiceConnected", e);
        }
    }

    public void onServiceDisconnected(ComponentName className) {
        try {
            Log.i(TAG, "onServiceDisconnected");
            aService = null;
        } catch (Exception e) {
            Log.e(TAG, "onServiceDisconnected", e);
        }
    }
};


public static void unbind() {
    try {
        Log.i(TAG, "unbind start");
        if (isBound && context != null) {
            Log.i(TAG, "Unbinding");
            context.unbindService(serviceConnection);
            isBound = false;
            context = null;
            Log.i(TAG, "Unbound");
        }
    } catch (Exception e) {
        Log.e(TAG, "unbind", e);
    }
}

}

Но onServiceConnected никогда не вызывается?

Журнал показывает все до:

...
Bound
  • Но НЕ onServiceConnected Start или выше
  • и без исключений.
  • Обратите внимание, что когда тот же код был в Activity, он работает (при вызове с MyActivity.this)

Что я делаю не так?

1 Ответ

0 голосов
/ 08 декабря 2011

Это

AService.bindService(this);

намного лучше, чем это?

bindService(new Intent(context, AService.class),
                serviceConnection, Context.BIND_AUTO_CREATE);

А реализация ServiceConnection в Activity действительно раздражает вас так сильно? Я сомневаюсь, что.

Я не вижу смысла централизовать все в Сервисе, а затем вызывать статический метод в реальном Сервисе, чтобы запустить Сервис из Активности. Лучше всего придерживаться стандартного способа, который Google рекомендует делать. Делая это по-своему, вы делаете свой код неясным и путаете других людей при чтении вашего кода (если вы работаете в команде). ИМО не имеет никакого смысла.

Вместо того, чтобы прилагать все свои усилия для изоляции каждого отдельного бита службы от активности, я бы лучше подумал о том, как изолировать бизнес-логику от активности и централизовать их в сервисе, и позволить Activity в основном сосредоточиться на вещах пользовательского интерфейса.

Действительно надеюсь, что это поможет вам.

...