将服务从一个 Activity 传递给另一个
Pass Service From one Activity to Another
如何将服务从一个 activity 传递到另一个?我有一个显示歌曲列表的音乐播放器 (Activity1),当您单击它时,它会启动 Activity1 中的服务。我有一个按钮,用户可以单击它来打开 Activity2。
那么我将服务从 Activity1 传递到 Activity2 的最佳方式是什么。如果服务在Activity1中启动,那么Activity2应该继续播放。如果Activity1中没有启动该服务,那么Activity2应该先启动该服务才能使用。
谢谢。
这是一些示例代码,MusicService 是一个 class 扩展服务 class。
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) {
}
};
}
您可以定义应用程序扩展 class 并在此 class 中使用 public 静态变量并在所有 activity 中访问此变量。
像这样:
public class G extends Aplication{
public static MusicService serviceMusic;
}
并在清单中:
<application ...
android:name=".G">
现在您可以在任何地方访问 G.serviceMusic。
我认为 bind 服务比 pass a static global 更好服务。由于您有多个活动将使用相同的服务,因此应该像这样创建一个基础 activity:
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.
}
}
然后你可以像这样实现子类activity:
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);
}
}
如何将服务从一个 activity 传递到另一个?我有一个显示歌曲列表的音乐播放器 (Activity1),当您单击它时,它会启动 Activity1 中的服务。我有一个按钮,用户可以单击它来打开 Activity2。
那么我将服务从 Activity1 传递到 Activity2 的最佳方式是什么。如果服务在Activity1中启动,那么Activity2应该继续播放。如果Activity1中没有启动该服务,那么Activity2应该先启动该服务才能使用。
谢谢。
这是一些示例代码,MusicService 是一个 class 扩展服务 class。
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) {
}
};
}
您可以定义应用程序扩展 class 并在此 class 中使用 public 静态变量并在所有 activity 中访问此变量。
像这样:
public class G extends Aplication{
public static MusicService serviceMusic;
}
并在清单中:
<application ...
android:name=".G">
现在您可以在任何地方访问 G.serviceMusic。
我认为 bind 服务比 pass a static global 更好服务。由于您有多个活动将使用相同的服务,因此应该像这样创建一个基础 activity:
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.
}
}
然后你可以像这样实现子类activity:
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);
}
}