【问题标题】:Service.onUnbind() called even if there are active clients?即使有活动的客户端也会调用 Service.onUnbind()?
【发布时间】:2012-05-21 13:20:55
【问题描述】:

练习的重点是:保持服务活跃,将它从一个活动传递到另一个活动。

  1. Activity A 在服务 S 上调用 bindService();
  2. S.onBound() 已调用;
  3. A.serviceConnection.onServiceConnected() 被调用;
  4. 活动 A 开始活动 B;
  5. Activity B 在服务 S 上调用 bindService();
  6. B.serviceConnection.onServiceConnected() 被调用; 5a:从 onServiceConnected() 活动 B 调用 A.finish();
  7. 活动 A 正在停止,从其 onDestroy() 方法调用 unbindService(S)。

预期行为:服务 S 继续愉快地存在,直到活动 B 调用 unbindService()

实际行为:

  1. S.onUnbind() 被调用;
  2. S.onDestroy() 被调用;
  3. 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 天内标记。

标签: android android-service


【解决方案1】:

更新:已解决。来自http://developer.android.com/reference/android/app/Service.html

服务既可以启动,也可以绑定连接。在这种情况下,只要服务已启动或有一个或多个带有 Context.BIND_AUTO_CREATE 标志的连接,系统就会保持服务运行。

如果不同的连接处于不对称的角色,这不是很直观,但可惜就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多