如何从片段绑定服务

时间:2013-01-02 15:31:54

标签: android android-fragments

我试图从一个片段绑定一个服务,就像我在一个活动中成功完成一样,但当我尝试在服务上调用一个方法时,我得到一个NullPointerException - 显然是因为该服务为null。现在在onStart中绑定到服务有什么问题,或者我只是做错了吗?

@Override
public void onStart() {
    super.onStart();

    Intent intent = new Intent(getActivity(), LiteTrickService.class);
    getActivity().registerReceiver(receiver, new IntentFilter(LiteTrickService.BROADCAST_ACTION));
    getActivity().registerReceiver(receiver, new IntentFilter(LiteTrickService.BROADCAST_FAIL));
    getActivity().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

@Override
public void onStop() {
    super.onStop();
    getActivity().unbindService(mConnection);
    getActivity().unregisterReceiver(receiver);
    mBound = false;
}

编辑:抱歉。这是我没有充分考虑这个问题的错误。 mConnection是ServiceConnection,如下所示:

private ServiceConnection mConnection = new ServiceConnection() 
{

    @Override
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
};

Stacktrace:

01-03 15:21:22.355: E/AndroidRuntime(12360): FATAL EXCEPTION: main
01-03 15:21:22.355: E/AndroidRuntime(12360): java.lang.NullPointerException
01-03 15:21:22.355: E/AndroidRuntime(12360):    at lite.hattrick.players.PlayerRankingFragment.onOptionsItemSelected(PlayerRankingFragment.java:205)

这将是抛出异常的确切位置: 案例POPULATE_ID:

        if (hasData) {
            return false;
        }
        if(!mBound)
            getActivity().bindService(new Intent(getActivity().getApplicationContext(), LiteTrickService.class), mConnection, Context.BIND_AUTO_CREATE);
        mService.refreshPlayers(); // Null Pointer Exception as mService is null
        pBar.setVisibility(View.VISIBLE);
        return true;

2 个答案:

答案 0 :(得分:13)

我解决了这个问题。事实证明,我忘了在我的清单中提供正确的包裹名称的服务声明。

改变

<service android:name=".LiteTrickService" />

<service android:name="lite.hattrick.services.LiteTrickService" />

我解决了问题,服务现在按预期连接。

答案 1 :(得分:0)

您的NullPointerException位于mService变量上。当您致电bindService()时,Activity会绑定到自己线程上的Service。这意味着您的代码将在服务绑定时继续运行。这会导致您的mService变量仍为null

您可以做的是将Service绑定后必须运行的代码移动到onServiceConnected()的{​​{1}}方法。这将确保mConnection变量将指向您的服务,并且不会为空。