我正在设计一个新闻应用程序,每当用户打开我的应用程序时,我都需要下载新鲜的文章和他们的详细故事。我是通过一个后台线程来做这一切的。我的主要关注点是,后台线程应该在用户退出应用程序时立即停止,以防止用户因此而产生额外的下载费用。
为了实现这一点,我在闪屏中启动后台下载,并不断检查让后台进程知道应用程序是否仍在运行的标志变量。
现在我的问题是:我非常清楚这个标志变量的初始化。我已经在Application子类的onCreate()中初始化了它,因为它是应用程序启动的地方。但我不知道该去哪里清理。我试着在我的MainActivity的onDestroy()中这样做。但是,我发现如果为system needs to free memory,则在一个活动到另一个活动之间的转换时经常会调用onDestroy()。因此,这样做会停止我的后台线程,即使我在屏幕之间切换,而不是真正关闭应用程序。我应该如何处理这种情况?有没有更聪明的方法来处理这件事?
发布于 2013-06-12 15:42:53
我不认为你必须这样做:要么是用户按下了“主页”按钮(大多数人都是这样做的),然后应用程序通常会在后台运行,因此用户仍然可以很容易地访问到他们离开的状态。要么你提供一个“关闭应用程序”按钮,它会真正杀死应用程序,这也会杀死应用程序创建的所有类型的线程,而你不必担心。
如果你真的想要,你可以捕获" home“点击,并在返回主页之前使用这些点击来杀死应用程序,如果你的应用程序没有初始化时间,这是一件很好的事情。
发布于 2013-06-12 17:16:32
But I've no idea where to clear it. I tried doing it in onDestroy() of my MainActivity.为了知道该活动是因为用户完成了它而被销毁(带有Back),还是安卓将重新创建它,你可以使用isFinishing();类似于:
protected void onDestroy() {
super.onDestroy();
if(isFinishing()) {
// stop the news feed download
}
}或者更好的方法是,在finish()中停止提要下载
public void finish() {
// stop the news feed download
super.finish();
}回到你上面所说的内容:
I'm very clear about initialization of this flag variable. I've initialized it in onCreate() of Application subclass since it is the point where application starts.因此,一旦应用程序启动,您将初始化下载,然后您将在Activity中的onDestroy()或finish()上停止它,这取决于您的意愿,但如果应用程序没有停止(最有可能),并且您再次进入新闻活动,您应该开始新闻下载。
我宁愿在onCreate(Bundle savedInstance)中在后台启动下载,但是当savedInstance为null时(所以我知道这是第一次创建此活动),并在finish()中停止它(如果还没有自己停止);
希望它能帮上忙!
发布于 2013-06-12 16:58:08
首先,为了从webservice (json或xml)下载数据,您应该使用AsyncTask (易于使用)。
所以我的意思是,当应用程序退出时,使用ondestroy()清除您的标志,也许您可以在按下home按钮时捕捉到
在您的活动中覆盖下面的方法,
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
}现在像这样处理key事件,
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME)
{
//do something
}
if(keyCode==KeyEvent.KEYCODE_BACK)
{
//do something
finish();
}
return false;
}https://stackoverflow.com/questions/17059217
复制相似问题