我几个星期以来一直在努力解决这个问题。我对Android很新,希望你能帮我一臂之力。
我有这个服务,它运行在一个单独的线程而不是应用程序。本质上,用户指示它启动,它应该保持活着,直到用户告诉它停止或直到它达到其目的 - 它在需要时安排自己的销毁(停止)。该服务需要保持活力,因为它包含重要的优先级相关信息,所以我不能在需要时转向警报管理器来恢复它 - 尽管我确实将警报管理器用于其他目的。我有两个问题:
其次,它会自动重启,从而导致数据被重新加载,因此我丢失了数据。
对于活动,它通过以下方式绑定到服务器:
private void startService() {
startService(new Intent(this, CES.class));
bindService(new Intent(this, CES.class), mConnection, 0);
}
最后,服务中的相关(或至少是我认为相关的)方法:
private final IBinder mBinder = new ICESInterface.Stub() { ..... }
@Override
public void onCreate() {
//keeps being called thus I lose my data }
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent,flags,startId);
//return START_STICKY;
}
如果您需要更多数据/信息,请与我们联系。
答案 0 :(得分:2)
通过在onBind中重新绑定活页夹,您将创建一个绑定服务,这意味着它已被绑定"到你的应用程序。这意味着当你的应用程序执行时它会被破坏,这解释了主页按钮的破坏。您应该为后台服务返回 null 。
@Override
public void onCreate() {
//keeps being called thus I lose my data
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
您应该使用START_STICKY
标志启动服务,这样如果操作系统在资源不足时销毁您的服务,它将在以后重新创建它。
在销毁您的服务之前,Android会拨打public void onLowMemory()
,保存您需要的所有数据,以便在重新启动服务时,您可以再次执行任务。
编辑:根据您的评论,您希望在后台运行并且还允许绑定的服务。如果在进行任何startService()
调用之前调用bindService()
方法,则可以执行此操作...这将有效地使您的服务成为已启动的服务而非绑定。在这种情况下,您可以返回IBInder
并绑定到它。
有一篇非常非常好的文章HERE