【发布时间】:2012-05-21 13:20:55
【问题描述】:
练习的重点是:保持服务活跃,将它从一个活动传递到另一个活动。
- Activity A 在服务 S 上调用 bindService();
- S.onBound() 已调用;
- A.serviceConnection.onServiceConnected() 被调用;
- 活动 A 开始活动 B;
- Activity B 在服务 S 上调用 bindService();
- B.serviceConnection.onServiceConnected() 被调用; 5a:从 onServiceConnected() 活动 B 调用 A.finish();
- 活动 A 正在停止,从其 onDestroy() 方法调用 unbindService(S)。
预期行为:服务 S 继续愉快地存在,直到活动 B 调用 unbindService()
实际行为:
- S.onUnbind() 被调用;
- S.onDestroy() 被调用;
- B.serviceConnection.onServiceDisconnected() 被调用;
从而破坏链接并与文档相矛盾。
为什么?我错过了什么?
更新:已解决。来自http://developer.android.com/reference/android/app/Service.html:
服务既可以启动也可以绑定连接。在 在这种情况下,系统将保持服务运行,只要 要么它已启动,要么有一个或多个与 它的连接 Context.BIND_AUTO_CREATE 标志。
代码如下:
public class A extends Activity {
private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
private String serviceClassName;
private ServiceConnection feedConnection;
private Messenger feedMessenger;
private void bind(String argument) {
serviceClassName = TheService.class.getName();
Intent intent = new Intent(serviceClassName);
intent.putExtra(Keys.ACCOUNT, argument);
feedConnection = new FeedConnection();
if (!bindService(intent, feedConnection, Context.BIND_AUTO_CREATE)) {
throw new IllegalStateException("Failed to bind to " + argument);
}
logger.debug("bindService(" + serviceClassName + ") successful");
}
private void forward() {
Intent intentB = new Intent();
intentB.setClassName(B.class.getPackage().getName(), B.class.getName());
intentB.putExtra(Keys.SERVICE_CLASS_NAME, serviceClassName);
startActivity(intentB);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(feedConnection);
}
private class FeedConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
A.this.feedMessenger = new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName className) {
A.this.feedMessenger = null;
logger.error("Crashed " + Integer.toHexString(hashCode()));
}
}
}
public class B extends Activity {
private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
private ServiceConnection feedConnection;
private Messenger feedMessenger;
private A activityA;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bindFeed();
}
private void bindFeed() {
Intent startingIntent = getIntent();
String serviceClassName = startingIntent.getStringExtra(Keys.SERVICE_CLASS_NAME);
Intent intent = new Intent(serviceClassName);
feedConnection = new FeedConnection();
// FIXME: BIND_AUTO_CREATE flag is missing
if (!bindService(intent, feedConnection, 0)) {
throw new IllegalStateException("Failed to bind to " + serviceClassName);
}
logger.debug("bindService(" + serviceClassName + ") successful");
}
private class FeedConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
B.this.feedMessenger = new Messenger(service);
logger.debug("bound " + className);
// Finish the previous activity only after the service is bound
activityA.fileList();
}
@Override
public void onServiceDisconnected(ComponentName className) {
B.this.feedMessenger = null;
logger.error("Crashed " + className);
}
}
}
【问题讨论】:
-
一些代码在这里可能会有所帮助
-
向我们展示
B.serviceConnection.onServiceConnected()中的代码。 -
@derekerdmann - 感谢您的提示,系统允许我在 2 天内标记。