2013-05-15 36 views
2

我正在写一个应用程序,需要每分钟注册实际位置,无论是在前台还是后台。当用户决定停止跟踪时,我想收集收集的所有数据并使用它们。后台服务与数据供以后使用最佳实践

为此,我想到了一种架构,它试图节省电池,并尽可能提高效率。我想知道我的选择是否足够体面。这里是:

  1. 我从一个Activity通过startService()启动一个服务S.该服务将构建一个数据结构以保存数据供以后使用。活动和服务之间的通信也将通过Messenger对象创建。

  2. 我注册将被接收机R.来管理它会是这样的位置更新:

    this.lm= (LocationManager) getSystemService(LOCATION_SERVICE);   
    Intent locationIntent= new Intent(getApplicationContext(),TravelPosition.class); 
    PendingIntent locationPendingIntent= PendingIntent.getBroadcast(getApplicationContext(), 0, locationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 7000, 1, locationPendingIntent); 
    
  3. 每次接收器R的触发,它将与服务S.沟通我正在考虑一个startService(Intent),我将坐标放在Intent的extras中。

  4. 服务S将在其内部数据结构中存储新数据(我的新位置坐标和其他信息)。无论应用程序是在前台运行还是在后台运行,一切都应该起作用

  5. 一旦用户通过活动中的按钮停止跟踪,后者将与服务进行通信以获取存储的数据,然后调用它stopService

您对此有何看法? 还有一个额外的问题:如果用户想要杀死应用程序,接收器会发生什么?它会打开应用程序吗?

回答

2

首先,你是正确的思维架构通过前开始写代码:)

其次,我建议阅读以下链接:

http://developer.android.com/guide/topics/location/strategies.html http://devdiscoveries.wordpress.com/2010/02/04/android-use-location-services/

三,你的情况,您不需要服务S.您可以注册接收器R,并在接收器R中完成您所需的一切(包括处理和保存数据)。在这种情况下,如果您退出应用程序,您仍然会继续接收位置更新。

+0

很酷,感谢您的链接(特别是第一个!) – Bertuz

+0

因此,回顾一下:我在某处(在我的活动中)创建了一个BroadcastReceiver并注册了它。之后,我可以访问它,这要归功于我保存的一个简单参考,并在我不再需要时取消注册。对? :-) 只是为了我的好奇心:我可以首先想到更重/更复杂任务的架构吗?有没有一个好的场景,我最好在接收器上使用服务? – Bertuz

+0

这是正确的。在cae中,如果您需要进行繁重的工作,那么您可能应该创建一个服务并创建工作线程以便在此服务中处理。主要原因是不阻止(因为我记得Receiver不会被第二次调用,直到第一次调用没有完成)。 –