在setUserVisibleHint中启动服务

时间:2018-01-05 10:04:17

标签: android android-fragments

我尝试使用FragmentViewPagerTabLayout。 现在我在片段中启动服务命令时遇到问题。

我有我的服务:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
  ....
}

我希望当我在TabLayout中更改选项卡时,选择的片段会提出服务请求。

所以我试过这个:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        Bundle extras = new Bundle();
        Intent msgIntent = new Intent(getActivity(), myService.class);
        msgIntent.setAction("INIT_REQUEST");
        msgIntent.putExtra("id", sectionNumber);
        msgIntent.putExtras(extras);
        getActivity().startService(msgIntent);

    }

但问题是在 getActivity()中抛出异常,因为它为null:

  

引起:java.lang.NullPointerException:尝试调用虚拟   方法' java.lang.String android.content.Context.getPackageName()'上   空对象引用

我哪里错了?

2 个答案:

答案 0 :(得分:0)

ViewPager.OnPageChangeListener添加到ViewPager并覆盖onPageSelected。您可以从那里向您的服务发送命令。

此外,如果您的片段数量不是很重,您可以在ViewPager上调用setOffsPageLimit(int limit)以将更多片段保留在内存中,这应该避免NullPointerException

注意:这还取决于您的寻呼机适配器实施。

答案 1 :(得分:0)

viewPager始终只加载一个fragment。所以,假设您有3 fragments,而您最初只有一个setUserVisibleHint。现在,当你转到第二个片段时,fragment将不会为空,因为onCreate已经加载了,但是当你从第一个片段转到第三个片段时,它将通过你的异常,所以你可以肯定它启动片段的服务onAttach(),或者也可以在片段的@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extras = new Bundle(); Intent msgIntent = new Intent(getActivity(), myService.class); msgIntent.setAction("INIT_REQUEST"); msgIntent.putExtra("id", sectionNumber); msgIntent.putExtras(extras); getActivity().startService(msgIntent); } 中执行此操作。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
 if (((MainActivity) getActivity() != null) {
    Bundle extras = new Bundle();
    Intent msgIntent = new Intent(getActivity(), myService.class);
    msgIntent.setAction("INIT_REQUEST");
    msgIntent.putExtra("id", sectionNumber);
    msgIntent.putExtras(extras);
    getActivity().startService(msgIntent);
  }
}

并在使用时检查您的活动是否为空。

DISTINCT

另请看一下这个答案。它可能对你有帮助。 setUserVisibleHint() throwing NullPointerException when calling getActivity()