【问题标题】:Why isn't onServiceConnected called?为什么不调用 onServiceConnected?
【发布时间】:2010-09-25 03:17:39
【问题描述】:

我是一个初学者,我做了一个简单的程序来展示服务的工作原理。

.....
toStartService = new Intent(this, SimpleService.class);
    sc = new ServiceConnection() {            
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Toast.makeText(MoreService.this, "SC: Binded", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(MoreService.this, "SC: Unbinded", Toast.LENGTH_SHORT).show();
        }    
    };


    startService.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MoreService.this, "Starting Service", Toast.LENGTH_SHORT).show();
            startService(toStartService);        
        }
    });

    stopService.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stopService(toStartService);
        }
    });

    bindService.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if((isBound = bindService(toStartService, sc, BIND_AUTO_CREATE))) {

            }
        }
    });

    unbindService.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isBound) {
                unbindService(sc);
                isBound = false;
            }
        }
    });

}

为什么不传递 sc 变量(在 bindService() 上)调用 sc.onServiceConnected() 方法? 代码有什么问题?

我满足了以下条件:

  • 当我按下 [startService] 服务开始很好,然后 [stopService] 服务停止良好。

  • 当我按下 [startService] 时,[bindService] 什么都不做,[unbindService] 也不做。

  • 当我按下 [bindService] 时,它创建了服务,[stopService] 不起作用。我按下 [unbindService] 服务正在调用 onDestroy() 方法。

为什么bindService创建的服务解绑后会被销毁?我尝试使用 startService 启动服务,但无法绑定。

Arrgh help mee,如果我错了,对不起。

【问题讨论】:

  • 我也有同样的问题。现在我明白为什么很多人讨厌 Java ......无论如何,当你说“代码有什么问题”时要非常小心,因为这个网站上有数百万假装“态度警察”,他们什么都不做,只是围绕着投票否决这样的问题你的。

标签: android


【解决方案1】:

这是所有这些方法的设计行为。比如在bindService(Intent service, ServiceConnection conn, int flags)根据the documentation的方法中,服务只会在调用上下文存在的情况下运行:

只要调用上下文存在,系统就会认为该服务是必需的。例如,如果这个 Context 是一个停止的 Activity,那么在 Activity 恢复之前,服务将不需要继续运行。

对于unbindService (ServiceConnection conn),文档说:

断开与应用程序服务的连接。随着服务重新启动,您将不再接听电话,现在允许服务随时停止。

startService (Intent service) documentation 中写道:

使用startService() 会覆盖由bindService(Intent, ServiceConnection, int) 管理的默认服务生命周期:它要求服务在调用stopService(Intent) 之前保持运行,无论是否有任何客户端连接到它。请注意,对startService() 的调用不是嵌套的:无论您调用多少次startService(),对stopService(Intent) 的一次调用都会停止它。

【讨论】:

  • 谢谢,“只要调用上下文存在,服务就会运行”,那么我如何绑定到已经在运行的服务呢?
  • 如果服务是startService启动的,那么你可以绑定到它,解绑后它会继续运行,但如果它是bindService启动的,那么它只会保持运行状态只要调用上下文存在。
  • 哦,我只是在服务的onBind方法中插入mBinder,然后ServiceConnection就开始工作了!为什么会变成这样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多