Android bindService或/和startService

时间:2010-09-11 01:47:05

标签: android

我想使用bindService方法创建服务。 但当我关闭一个Activity时,我的服务被销毁了,我不希望这样。

我尝试使用startForeground(NOTIFICATION_ID, notification);服务onCreate将服务放在前台,但服务仍在销毁。

现在我尝试使用call两个方法同时启动Service:

    Intent bindIntent= new Intent(this, ServiceC.class);
    startService(bindIntent);
    bindService(bindIntent, onService, BIND_AUTO_CREATE);

通过调用这两个方法Service不会被破坏。我的应用程序可以正常使用这种方法。

有人可以向我解释这是否是一种好方法,或者如果不是,请你告诉我为什么startForeground(NOTIFICATION_ID, notification);不起作用?

使用bindService的最佳方法是什么,但同时我不希望服务自行销毁。

2 个答案:

答案 0 :(得分:7)

我使用了相同的解决方案,这是合法的解决方案。来自Service参考:

  

服务既可以启动也可以   连接到它的连接。在这样的   情况下,系统将保留服务   只要它运行,它就会运行   开始或有一个或多个   与它的连接   Context.BIND_AUTO_CREATE标志。一旦   这些情况都不成立   调用service的onDestroy()方法   而服务是有效的   终止。

startForeground()无法正常工作,因为它只是试图阻止服务被系统杀死,但它的生命周期是另一回事:如果没有什么更多的绑定到该服务并且它没有启动,它只是停止。

答案 1 :(得分:0)

如果使用startService()启动服务,则不会销毁它。尝试启动一个服务,它扩展了IntentService并在onHandleIntent()中有一个循环。循环完成后,服务被破坏,与活动完成无关。用户可以关闭应用程序,但服务不会被杀死。

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) {
            }
        }
    }
  }

}