在 Android 上,我有一个Activity
调用FirstActivity
,它启动一个Service
命名MyService
来在后台执行网络操作。TheActivity
和 theService
一直通过调用方法相互通信。
现在,当用户从FirstActivity
to导航时,不应终止或重新创建SecondActivity
后台服务,而是保持活动状态并传递给现在与该服务进行通信的服务。SecondActivity
换句话说,Service
只要两个Activity
s 之一在运行,它就应该在运行,并且当用户在两个Activity
s 之间导航时它不应该停止。
其中一个Activity
s 将始终处于前台,在此期间,服务应该(最好)永远不会被杀死。我认为这应该不是问题,因为这两个Activity
中的一个始终处于活动状态,因此 Android 知道该服务很重要,而不是必须被杀死的东西。
(如果没有办法阻止 Android 不时杀死并重新创建服务,我需要一种方法来优雅地恢复服务的完整状态。)
综上所述,两者的“组合”Service
应该具有相同的寿命。Activity
它应该从它们中的第一个开始,并且在它们都被摧毁之前停止。
那么以下代码对于该设置和目标是否正确?
public class MyService extends Service {
public class LocalBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
...
}
public class FirstActivity extends Activity {
private MyService mMyService;
private ServiceConnection mMainServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
MyService mainService = ((LocalBinder) service).getService();
mMyService = mainService;
mMyService.setCallback(FirstActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName className) {
mMyService = null;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
...
startService(new Intent(FirstActivity.this, MyService.class));
}
@Override
protected void onResume() {
super.onResume();
bindService(new Intent(FirstActivity.this, MyService.class), mMainServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
super.onPause();
if (mMainServiceConnection != null) {
unbindService(mMainServiceConnection);
}
if (mMyService != null) {
mMyService.setCallback(null);
}
if (!isUserMovingToSecondActivity) {
stopService(new Intent(FirstActivity.this, MyService.class));
}
}
@Override
public void onBackPressed() {
stopService(new Intent(FirstActivity.this, MyService.class));
super.onBackPressed();
}
...
}
public class SecondActivity extends Activity {
private MyService mMyService;
private ServiceConnection mMainServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
MyService mainService = ((LocalBinder) service).getService();
mMyService = mainService;
mMyService.setCallback(SecondActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName className) {
mMyService = null;
}
};
@Override
protected void onResume() {
super.onResume();
bindService(new Intent(SecondActivity.this, MyService.class), mMainServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
super.onPause();
if (mMainServiceConnection != null) {
unbindService(mMainServiceConnection);
}
}
@Override
protected void onDestroy() {
...
stopService(new Intent(SecondActivity.this, MyService.class));
}
...
}
Activity
这是在s 的后台保证不会被杀死或重新创建的持久服务的最佳方法吗?
怎么样Context.BIND_AUTO_CREATE
?在这里设置这个标志是否正确?那么Context.BIND_ADJUST_WITH_ACTIVITY
——Context.BIND_WAIVE_PRIORITY
我需要这些吗?