2012-07-20 29 views
0

我从活动创建了一个已启动的服务。我很好奇:如果活动被破坏会发生什么?服务是否仍然运行? (我认为它运行!)活动被破坏并重新创建后开始访问服务

然后,当活动重新创建,有什么办法与该服务进行通信?我只需要知道服务是否仍在运行,如果正在运行,那么我想将活动的引用传递给服务。

+0

取决于服务类型。取决于您的启动参数。有些会通过电话关机/开机或重新开机。定时器服务将需要由您的应用程序重新启动(需要注册以启动通知才能完成此操作)。如果您需要注册唤醒并处理广播,则您的服务将保持过去应用程序销毁的状态。另外,请小心应用程序服务的上一个结尾。你真的可以用这种方式阻塞某人的电话。真的,真的是彻底地测试它们。 – 2012-07-20 19:30:39

+0

有没有办法检测服务是否已经启动并运行?我想从一个活动中检测到,如果它尚未启动,它将启动此服务。 – giga 2012-07-21 03:46:43

回答

1

好的,评论不够大。以下是我用来启动服务的一些代码。启动服务之后是一个函数,用于确定服务是否正在运行。 DownloadDatabase类扩展了IntentService。该服务下载一个由Android外部创建的70兆SQLite数据库。

Intent intentService = new Intent(this, DownloadDatabase.class); 
startService(intentService); 

以下函数检查服务是否已在运行。它被编码为一个函数,因为我从其他例程中调用它来执行其他的验证,如果没有运行的话。

private boolean isMyServiceRunning() { 
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager 
      .getRunningServices(Integer.MAX_VALUE)) { 
     if ("com.hodsonssoftwarellc.nutritionexplorer.DownloadDatabase" 
       .equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 

您还需要以下权限在您的清单:

uses-permission android:name="android.permission.GET_TASKS" 

什么在isMyServiceRunning功能发生如下:

  1. 行为管理取得。
  2. 检索当前正在运行的任务列表,并将其用作循环特例中的参数。
  3. 由于每个任务都从列表中检索,因此任务名称将与我的完全限定的类名称进行比较以用于下载服务。
  4. 如果找到匹配项,则函数返回true。否则它返回false。

所以,回答你的问题,是的,你可以检查它是否从你的任务开始运行。即使您退出该任务并重新开始。您还可以检查是否正在从不同的活动或应用运行。

注意:此代码是为2.x兼容性编写的。如果您正在使用版本3或更高版本进行下载,请使用下载管理器,而不要编写自己的下载服务。

+0

感谢您的回答。我会尽快发布我的结果。 – giga 2012-07-22 08:03:06

+0

工作完美!非常感谢:) – giga 2012-07-22 08:23:21

+0

不客气。 – 2012-07-24 00:15:29

相关问题