绑定Android服务

时间:2018-02-28 17:55:51

标签: android android-service android-service-binding

检查您是否已在Android中绑定服务的常用方法是在绑定步骤中保留一个布尔参数,例如mBound,如Android开发人员指南中所述。我注意到这个Android参考教程中存在一个问题,我认为这种方法在某种程度上是一种不好的做法。以下是Bound Services的代码:

这是一个代码块,语言代码为提示:

public class ActivityMessenger extends Activity {
    Messenger mService = null;
    boolean mBound;

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            mService = new Messenger(service);
            mBound = true;
        }

        public void onServiceDisconnected(ComponentName className) {
            mService = null;
            mBound = false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        // Bind to the service
        bindService(new Intent(this, MessengerService.class), mConnection,
            Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // Unbind from the service
        if (mBound) {
            unbindService(mConnection);
            mBound = false;
        }
    }
}

好的,这是问题所在。我们假设OnStop()之后立即调用OnStart()。您可以通过在OnCreate()中放置断点来创建此情况,并等待手机屏幕变暗以强制应用程序重新创建,然后继续运行应用程序。

如果发生这种情况,mBount变量在您运行false时仍然会OnStop(),因为尚未调用服务连接onServiceConnected()。因此,您不会致电unbindService(),并且您将拥有一个已绑定且永不解除绑定的服务。

有关更好的绑定服务方法的任何建议吗?我想知道在任何情况下调用unbideService()是否足够(例如调用即使服务现在没有绑定)。

最好的问候

1 个答案:

答案 0 :(得分:1)

我还没有在实践中尝试这一点,但是当调用 mBound = true而不是回调时,设置bindService似乎是合理的。实际上,documentation表示即使unbindService返回bindService,您也应该致电false(意味着您永远不会收到任何onServiceConnected来电和mBound永远不会是真的):

  

注意:如果方法返回false,则您的客户端没有有效的   连接到服务。但是,您的客户仍应致电   unbindService();否则,您的客户将保留服务   在空闲时关机。

考虑到这一点,很明显只在mBound = true中设置onServiceConnected是不够的(或者至少建议)。我怀疑在之前没有绑定时调用unbindService是无操作,但可能需要一些确认。如果是这样,在调用mBound = true时设置bindService似乎是一种很好的方法。