安卓生命周期 - 我应该使用服务吗?

3
我正在创建一个聊天应用程序,想知道是否应该使用服务以及它如何影响我的应用程序的生命周期。我知道如果内存不足,Android操作系统会销毁我的应用程序。我的问题是:如果Android销毁了仅使用活动和接收器的应用程序,它们是否会重新启动,还是需要一个STICKY服务来实现?我已经创建了两种类型的应用程序,所以我有一些想法,但我只是想确保。
其次,http://developer.android.com/reference/android/app/Service.html说:

请注意,服务与其他应用程序对象一样,运行在其主机进程的主线程中。这意味着,如果您的服务将执行任何CPU密集型操作(例如MP3播放)或阻塞操作(例如网络),它应该在自己的线程中生成以执行该工作。

我的应用程序有一个长时间运行的线程(AsyncTask),负责从服务器读取数据(并不断阻塞)。如果我不使用服务,而是继续使用AsyncTask,这是否是个好主意?如果Android选择关闭我的应用程序,这将如何影响应用程序的生命周期?如果没有必要,长时间运行的服务是否是好的实践,例如,我是否应该仍然创建一个STICKY Service?我注意到许多聊天和文本消息应用程序使用粘性服务。我只是在思考我的应用程序是否需要一个。谢谢!
3个回答

5

基本上,服务允许运行一个与单个活动生命周期无关的任务。

例如,您可以使用普通对象在单个活动中播放音乐。但是,如果您希望您的应用程序播放音乐并允许用户进出所有活动,则需要使用服务。

如果您的应用程序具有多个活动,并且您希望聊天客户端仍然侦听套接字(我敢打赌您确实希望如此),那么您应该编写一个服务。

如果您希望用户知道服务正在运行,则您的服务应该进入前台并通过通知栏进行交互。

如果您希望您的活动与服务通信,则您应该从活动内部绑定您的服务

最后,你应该提供一种清晰的方式让用户停止你的服务,因为这个过程将不再与你的应用程序生命周期绑定,你必须明确地调用它的stop方法,或者调用stopService或使服务调用stopSelf。然后为你的用户提供一个简单的停止服务的方法。
你还需要获得电源锁定和很可能是wifi锁定来保证你的服务不会被设备休眠中止,并且当你的应用程序被Android清除时,网络连接对于你的服务是保留的。

在developer.android.com上,RandomMusicPlayer示例是一个很好的起点,当你需要实现一个需要互联网访问并在前台运行的音乐(或聊天)服务时。 - Jens
我现在能够运行不同的应用程序,并在没有使用服务的情况下收到新消息通知(AsyncTask始终在后台运行)。如果我想在活动之间访问资源,我会使用单例和我的Application类中的静态引用,因此也没有问题(每个活动都不需要绑定服务)。就发送通知而言,任何活动都可以通过获取NotificationManager来发送通知。据我所知,即使在服务中,我仍然需要创建AsyncTask。我不确定我是否看到了区别。 - CompEng88

0

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


0

这不是直接的答案,但你可能想要研究一下使用XMPP

Android可以随时销毁任何Activity。

我肯定会使用一个服务。你已经在使用AsyncTask,所以线程方面没问题。如果你希望在应用程序不在前台时收到聊天回复,则需要使用服务。

然后,您的服务可以在接收到新消息或其他所需内容时发送通知。


我实际上尝试过XMPP。它有很多我想要的东西,但我想要更多对数据库等内容的控制权。构建自己的服务器似乎是我寻求的控制方式,而我完全有能力做到。 - CompEng88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接