安卓绑定服务或/和启动服务

9
我希望使用bindService方法创建服务。但是当我关闭一个Activity时,我的服务会被销毁,而我不想要这样。
我尝试在服务的onCreate方法中使用startForeground(NOTIFICATION_ID, notification);将服务置于前台,但服务仍然被销毁。
现在我尝试同时调用两个启动服务的方法:
    Intent bindIntent= new Intent(this, ServiceC.class);
    startService(bindIntent);
    bindService(bindIntent, onService, BIND_AUTO_CREATE);

通过调用这两个方法,服务不会被销毁。使用这种方式,我的应用程序可以正常运行。
有人能否解释一下这是好的方法还是不好的方法,如果不好的话,你能否给我一个想法,为什么 startForeground(NOTIFICATION_ID, notification); 不起作用?
使用bindService的最佳方法是什么,但同时我不希望服务自我销毁。

我知道这是一个老问题,但还是不要脸地问一下,有没有关于如何正确使用bindService的解决方案? - LOG_TAG
2个回答

8
我使用了相同的解决方案,它是一种合法的解决方案。参考自Service
一个服务可以同时被启动并且连接到。在这种情况下,只要服务已经被启动或者有一个或多个带有Context.BIND_AUTO_CREATE标志的连接到服务上,系统将会保持服务运行。当这些情况都不再存在时,服务的onDestroy()方法将会被调用,并且服务将会被有效地终止。 startForeground()不起作用,因为它只是试图防止系统杀死服务,但它的生命周期是另一回事:如果没有其他东西与该服务绑定并且该服务没有被启动,它就会停止。

那么,您宣称使用bindService没有解决方案?我们必须将所有实现从bindService更改为startService吗? - LOG_TAG

0
如果使用startService()启动服务,则该服务不会被销毁。尝试启动一个服务,它扩展了IntentService并在onHandleIntent()中有一个循环。当循环完成时,服务被销毁,并且与Activity的结束无关。用户可以关闭应用程序,但服务不会被杀死。
public class MyService extends IntentService
{
  private static final String serviceName = "MyService ";

  public MyService () {
    super(serviceName);
  }

  @Override
  public void onDestroy()
  {
    Log.v(serviceName, "onDestroy");
    Toast.makeText(this, serviceName+" stopped", Toast.LENGTH_LONG).show();
    super.onDestroy();
  }

  @Override
  protected void onHandleIntent(Intent arg0) {

    long endTime = System.currentTimeMillis() + 30*1000;
    while (System.currentTimeMillis() < endTime) {
        synchronized (this) {
            try {
                Log.v(serviceName, "Service loop");
                wait(1000);
            } catch (Exception e) {
            }
        }
    }
  }

}

@Deepscom - IntentService 的目的是在 onHandleIntent() 完成后自行终止。这是设计上的考虑。 - Sofia Clover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接