2012-02-29 50 views
3

我正在创建一个聊天应用程序,我想知道是否应该使用服务以及它将如何影响我的应用程序的生命周期。我知道如果没有足够的内存,Android操作系统可能会摧毁我的应用程序。我的问题:只有使用活动和接收器的应用程序重新启动,如果Android销毁它们,或者我需要一个STICKY服务吗?我已经创建了两个应用程序,所以我有点想法,但我只想确保。Android生命周期 - 我应该使用服务吗?

二,http://developer.android.com/reference/android/app/Service.html说:

需要注意的是服务,像其他应用程序对象,在主线程 其宿主进程的运行。这意味着,如果你的服务是 打算做任何CPU密集型(如MP3播放)或阻塞(如 如网络)业务,它应该酿出自己的线程在其中 做这项工作。

我的应用程序有一个长时间运行的线程(AsyncTask),它执行从服务器读取(并不断阻塞)。离开我的应用程序是否是一个好主意,没有服务,而是使用AsyncTask代替?如果Android选择关闭我的应用程序,这将如何影响应用程序的生命周期?如果不需要像在我应该做一个STICKY服务那样,有一个长期运行的服务是好的做法吗?我注意到很多聊天和txt msg应用程序使用粘性服务。我只是想想如果我的应用程序会需要一个。

再次提前致谢!

回答

5

基本上,服务允许运行未绑定到一个单一的活动周期的任务。

例如,您可以使用普通物体在单个活动中播放音乐。但是,如果您希望自己的应用播放音乐并允许用户进出所有活动,那么您需要一项服务。

如果您的应用程序有多个活性及你希望你的聊天客户端仍然听插座(和我打赌你想要的),那么你应该写一个服务。

如果希望用户知道一个服务正在运行,那么你的服务你的服务应该去foreground和允许通过通知栏互动。

如果你想让你的活动与你的服务进行沟通,那么你应该bind your service from within your activities

最后,您应该为用户提供一个明确的方法来访问stop your service,因为此过程将不再与您的应用生命周期相关联,并且您必须显式调用其停止方法或调用stopService或使服务调用stopSelf本身。然后为用户提供一种简单的方法来停止服务。

你还需要得到一个powerlock和最可能的wifi lock为您的服务,以便它不会停止设备进入睡眠状态,并保持连接到您的服务,当您的应用程序由android清理。

+0

developer.android.com上的[** RandomMusicPlayer **](http://developer.android.com/resources/samples/RandomMusicPlayer/index.html)示例是实现音乐(或聊天)的一个很好的起点,需要访问互联网并在前台运行的服务。 – Jens 2012-02-29 08:12:57

+0

我现在可以运行不同的应用程序,并且在不使用服务的情况下收到新消息时仍会收到通知(AsyncTask始终处于后台运行状态)。如果我想在活动之间访问资源,我在Application类中使用单例和静态引用,所以这也没有问题(每个活动都不需要绑定服务)。至于发送通知,任何活动都可以通过获取NotificationManager来发送通知。据我所知,即使在服务中,我也需要创建一个AsyncTask。我不确定我是否看到差异。 – ComputerEngineer88 2012-03-01 05:51:35

0

我认为你最好使用服务。 AsyncTask基本上是相同的,因为它运行在与主线程不同的线程中。我在某些情况下看到了一些示例,AsyncTask在离开主UI线程时暂停了。我相信,当内存不足时,服务将会重新启动,而不仅仅是被杀死,但我不是100%确定的。长时间运行的后台任务是服务的目的。

0

这不是一个直接的答案,但你可能要考虑使用XMPP

Android可以随时销毁任何活动。

我肯定会使用一项服务。你已经使用了一个AsyncTask,所以你很好线程。如果你想在你的应用程序不在前台时回复你的聊天记录,那么服务将是必要的。然后

您的服务可能会发送通知时,收到新信息或任何需要。

+0

我已经尝试过XMPP。它有很多我正在寻找的东西,但我想要更多地控制数据库中的内容等。构建我自己的服务器对于我期待的控件来说似乎是理想的,而且我的能力更强。 – ComputerEngineer88 2012-03-01 05:54:54