android - 如何从 fragment 绑定(bind)服务

标签 android android-fragments

我正尝试以与我在 Activity 中成功完成的方式相同的方式从 fragment 绑定(bind)服务,但是当我尝试调用服务上的方法时,我得到 NullPointerException - 显然是因为服务为空。现在绑定(bind)到 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;
    }
};

堆栈跟踪:

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;

最佳答案

我解决了这个问题。原来我忘了在我的 list 中提供服务声明及其正确的包名称。

通过改变

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

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

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

关于android - 如何从 fragment 绑定(bind)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124632/

相关文章:

android - GestureDetector.OnGestureListener 覆盖的方法在 Android API 33 中不起作用

java - 如何使用 libgdx 仅触摸屏幕左侧时创建监听器

android-fragments - 在底部导航片段之间切换时工具栏会闪烁

java - java (android) 中 null 的类型转换会引发错误或异常吗?

android - 使用GSON存储在Android中解析的Json

android - 为什么我们需要 Activity B 来支持 android 设计的多个屏幕

android - FragmentPagerAdapter getItem 未被调用

android - 如果数据已经加载,则停止从 .json 加载数据

android - 从对话框 fragment 启动 Activity

android - 报告 XML 文件错误并中止构建