我想使用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的最佳方法是什么,但同时我不希望服务自行销毁。
答案 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) {
}
}
}
}
}