2014-02-19 23 views
1

我有一个应用程序,我已经将某个服务连接到自定义应用程序类中,以便所有活动都可以访问它,但是一旦我的应用程序关闭,我需要关闭该服务。如何捕捉应用程序的结尾?

我想发送捆绑数据只是一次,而不是每次单个活动命中onPause/Destroy()。

我也想到了Application类中的Terminate()并不总是被调用。

有没有更好的方法来做到这一点?

+0

'onTerminate'“是在仿真过程中的环境中使用”它实际上应该永远不会被称为真正的设备应用程序,因为应用程序进程只是被杀死 – zapl

回答

3

如果您的目标是API级别14或更高,则可以使用registerActivityLifecycleCallbacks注册侦听器并计算onActivityResumed和onActivityStopped中的启动/停止次数。当计数器为0时,您知道堆栈中没有更多的活动,并且您可以关闭服务

+0

谢谢阿列克斯!这种方法接近完成我所需要的:) 这里是一个非常有用的文章,为未来的流浪者 - http://www.mjbshaw.com/2012/12/determining-if-your-android-application.html 我现在可以对后台应用程序进行正确的反应并回到最前面。 –

1

不幸的是,没有回调/方法来检测您的应用程序进程何时停止或将要停止。 @Alex建议收听Activity生命周期回调可能会更棘手。

但是,如果你想检测到这只是为了停止运行Service,那么这个问题是不相关的,因为如果你的进程弯腰,那么它拥有的所有正在运行的服务也会停止!

如果你的意思是要停止服务时,应用程序不是在前台(完全不同的事情..),那么解决方案不同的是:

如果你总是使用bindService()代替startService()内的onResume活动回调,并在onPause()停止它,然后当你的应用程序将进入后台 - 服务将自动停止。

另一种选择是使用服务回调来检测,如果目前有界的活动:

@Override 
public IBinder onBind(Intent intent) { 
    mBoundedToActivity = true; 
    return mBinder; 
} 

@Override 
public void onRebind(Intent intent) { 
    mBoundedToActivity = true; 
    super.onRebind(intent); 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    mBoundedToActivity = false; 
    return super.onUnbind(intent); 
} 
+0

我真的不在乎服务如何死亡,我有从所有活动收集的数据并捆绑在一个地方,只需要在用户离开我的应用程序时通过服务将此数据发送到服务器(他已完成使用它并退出或打开另一个,而我的背景停留并最终在不久的将来死亡)。我只想抓住我的应用程序死亡的时刻,并在此之前使用该服务推送收集的数据。这可以确保我只需一个连接,而不必监听应用程序中每个活动的onPause()。 –

+0

@troty_master:“app for good”=应用程序进程已停止?或=应用程序在后台?我仍然不明白你们两个的意思是什么 –

+0

我猜这两种方法都行得通,只要我不会错过发送数据的机会,而且我不会多次发送它,以便单次使用我的应用程序。 –

相关问题