2013-01-02 33 views
0

我有一个活动将一些细节发送到我的数据库,但是当我点击后退按钮时它会停止。 是否有可能让它在后台运行?我听说使用服务可以解决这个问题,但是因为我所有的类都是活动,所以我想知道它是否可行。 用onStop方法的某些代码无法完成这项工作吗?在后台运行一个活动

+3

不,onStop应该很快,所以你不能在那里继续处理。如果你有长时间运行的进程,你应该把它们放在后台,但是你也应该只对用户交互进程使用活动。迁移到“服务”并不困难,值得付出努力。 – 323go

+0

您正在寻找服务。看看这个教程http://www.vogella.com/articles/AndroidServices/article.html –

+0

让我们假设我的应用程序是某种计时器..我想在后台运行它,但当用户重新打开它应该看到它是一种活动......我该如何分解它?服务是什么以及活动是什么? –

回答

1

你提到所有的类都写成活动,我假设你的应用程序逻辑嵌入了你的用户界面逻辑。这通常不是一个好的做法 - 您应该尝试将特定于应用程序的代码迁移到单独的类。通过在用户界面之外使用此功能,您的应用程序将以多种方式受益。

要回答你的问题,可以让你的应用程序通过子类Service在后台执行功能。看一看here是一个很好的解释。

0

您应该使用意图编写活动与之通信的服务。因此它应该将数据发送到服务以便发送到数据库,然后服务可以通知活动。当活动监听来自服务的事件时,您正在实现Observer模式(Java和Android中的监听器以及许多其他事件处理系统)。

您也可以轮询服务,但这不是获取状态更新的首选模式。

2

Heey,

创建一个扩展Service的新类。 添加必要的覆盖。

@Override 
public IBinder onBind(Intent intent) 
{ 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    //this service will run until we stop it 
      // This will execute when the service starts 


    return START_STICKY; //makes it sticky to keep it on until its destroyd 
} 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
      // when the service is destroyd 
} 

可以启动与服务:

stopService(new Intent(getBaseContext(), ServiceClassName.class)); 

您可以停止服务:

stopService(new Intent(getBaseContext(), ServiceClassName.class)); 

希望这有助于:)

1

你将不得不重写onBackPressed方法来做你想做的事情。如果你想“隐藏”活动(所以用户看到它“关闭”),你可以调用moveTaskToBack方法。

+0

“moveTaskToBack”后应用程序会继续运行吗? –

+0

您应该测试用于db写入的“背景”代码。至少它会隐藏它之前保存状态。 – DNax

+0

我应该使用super.onBackPressed()吗?我认为没有,因为这是杀死我的应用程序,我猜对的方法? –