从其他活动引用静态ServiceConnection是否正确?

时间:2014-08-13 22:45:40

标签: android android-activity android-service

我正在主要活动中开始并使用我的服务:

public static MyServiceConnection serviceConnection;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    serviceConnection = new MyServiceConnection();
    startService(new Intent(...));
    bindService(new Intent(...), serviceConnection.getServiceConnection(), 0);
}

如果我将开始另一个活动(没有完成Main),我可以像这样使用静态变量:

Main.serviceConnection.Method1()

我会得到NullReferenceException吗?例如,如果操作系统决定释放一些内存并破坏主要活动?有可能吗?

1 个答案:

答案 0 :(得分:1)

  

从其他活动引用静态ServiceConnection是否正确?

没有。引用the documentation

  

您应该在匹配客户生命周期的启动和拆卸时刻配对绑定和解除绑定。例如:

     
      
  • 如果您只需要在活动可见时与服务进行交互,则应在onStart()期间绑定并在onStop()期间取消绑定。
  •   
  • 如果您希望活动即使在后台停止时也会收到响应,那么您可以在onCreate()期间绑定并在onDestroy()期间取消绑定。请注意,这意味着您的活动需要在其运行的整个时间内使用该服务(即使在后台运行),因此如果该服务处于另一个流程中,那么您会增加流程的权重并且更有可能系统将杀死它。
  •   

请允许每个组件绑定到服务本身。

  

我在主要活动中开始和帮助我的服务:

请删除static关键字。请仅在绑定到服务的组件中使用ServiceConnection。如果您有其他组件,他们也可以自己绑定到服务。

  

我会得到NullReferenceException吗?

很可能。例如,当你你将要开始另一个活动(没有完成主要)"时,并不要求" Main"活动留在身边。如果Android终止您的进程(在您移至后台后)并且用户通过recent-tasks列表返回给您,则可以在" Main"之前创建您的第二个活动。是在新的过程中。

请允许您的第二个活动绑定到服务本身。或者,不要使用绑定服务。