Передайте услугу от одного действия к другому

как передать услугу из одной деятельности в другую? У меня есть музыкальный проигрыватель (Activity1), который отображает список песен, и когда вы нажимаете на него, он запускает службу в Activity1. У меня есть кнопка, которую пользователи могут нажать, чтобы открыть Activity2.

Итак, как мне лучше всего передать службу от Activity1 к Activity2. Если служба запущена в Activity1, то Activity2 должно продолжать играть. Если служба не запущена в Activity1, то Activity2 должна запустить службу перед ее использованием.

Спасибо.

Вот пример кода, MusicService — это класс, который расширяет класс службы.

 public class Activity1 extends AppCompatActivity {

 private MusicService serviceMusic;  

private ServiceConnection musicConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MusicService.PlayerBinder binder = (MusicService.PlayerBinder) service;
        //get service
        serviceMusic = binder.getService();
        serviceMusic.setSongList(songList);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};

}


person Julia    schedule 05.08.2016    source источник


Ответы (2)


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

как это :

public class G extends Aplication{
   public static MusicService serviceMusic;  
}

и в манифесте:

  <application ...
    android:name=".G">

Теперь вы можете получить доступ к G.serviceMusic где угодно.

person Saman    schedule 05.08.2016

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

BasicServiceActivity.java

public abstract class BasicServiceActivity extends AppCompatActivity {
    protected DvrService mDvrService;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic);
        attachService();
    }

    @Override
    protected void onDestroy() {
        detachService();
        super.onDestroy();
    }

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            DvrService.DvrServiceBinder serviceBinder = (DvrService.DvrServiceBinder) binder;
            mDvrService = serviceBinder.getService();
            onServiceAttached(mDvrService);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mDvrService = null;
        }
    };

    private void attachService() {
        Intent service = new Intent(this, DvrService.class);
        bindService(service, mServiceConnection, Service.BIND_AUTO_CREATE);
    }

    private void detachService() {
        unbindService(mServiceConnection);
    }

    /** Callback when service attached. */
    protected void onServiceAttached(DvrService service) {
        // do something necessary by its subclass.
    }
}

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

public class ServiceActivity extends BasicServiceActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startService(new Intent(this, DvrService.class));
    }

    @Override
    protected void onDestroy() {
        if (mDvrService != null) {
            mDvrService.removeListener1(mListener1);
        }
        super.onDestroy();
    }

    @Override
    protected void onServiceAttached(DvrService service) {
        // do your stuff, for example add a listener.
        service.addListener1(mListener1);
    }
}
person li2    schedule 09.08.2016