Как получить доступ к "Деятельности" из класса Service через Intent?


Я новичок в программировании на Android, поэтому у меня нет четкого понимания" Контекста "и" Намерения".
Я хочу знать, есть ли способ получить доступ к Activity из класса Service?  т.е. скажем, что у меня есть 2 класса: один из них "Активность", а другой - "Сервис", и я создал намерение в своем классе Activity для запуска службы.

Или, как получить доступ к экземпляру класса "Сервис" из моего класса "Активность", потому что в таком рабочем классе класс сервиса не создается непосредственно моим кодом активности.

public class MainActivity extends Activity {
       .       
       .
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       startService(new Intent(this, CommunicationService.class));
       .
       .    
}


public class CommunicationService extends Service implements ..... {
    .
    .
    @Override
    public int onStartCommand(final Intent intent, int flags, final int startId) {
        super.onStartCommand(intent, flags, startId);
        ....
    }

}

Ответ 1

Вы можете использовать bindService(Intent intent, ServiceConnection conn, int flags) вместо startService для запуска службы. И conn будет внутренним классом, как:

private ServiceConnection conn = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mMyService = ((CommunicationService.MyBinder) service).getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};

mMyService является экземпляром вашего CommunicationService.

В своем CommunicationService просто переопределите:

public IBinder onBind(Intent intent) {
    return new MyBinder();
}

и следующий класс в CommunicationService:

public class MyBinder extends Binder {
    public CommunicationService getService() {
        return CommunicationService.this;
    }
}

Таким образом, вы можете использовать mMyService для доступа к любым общедоступным методам и полям в вашей деятельности.

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

Сначала напишите интерфейс, например:

public interface OnChangeListener {
    public void onChanged(int progress);
}

и в вашем сервисе добавьте общедоступный метод:

public void setOnChangeListener(OnChangeListener onChangeListener) {
    this.mOnChangeListener = onChangeListener;
}

вы можете использовать onChanged в своей службе в любом месте и реализовать только в своей деятельности:

    public void onServiceConnected(ComponentName name, IBinder service) {
        mMyService = ((CommunicationService.MyBinder) service).getService();
        mMyService.setOnChangeListener(new OnChangeListener() {
            @Override
            public void onChanged(int progress) {
                // anything you want to do, for example update the progressBar
                // mProgressBar.setProgress(progress);
            }
        });
    }

ps: bindService будет выглядеть следующим образом:

this.bindService(intent, conn, Context.BIND_AUTO_CREATE);

и не забывайте

protected void onDestroy() {
    this.unbindService(conn);
    super.onDestroy();
}

Надеюсь, что это поможет.