我正在设计一个新闻应用,我需要在用户打开我的应用时下载新文章及其详细故事。我正在做所有这一个后台线程。我的主要关注点是,一旦用户退出应用程序,后台线程就应该停止,以防止用户产生额外的下载费用。
为实现这一目标,我在启动画面中启动后台下载,并继续检查标志变量,让后台进程知道应用程序是否仍在运行。
现在我的问题是:我非常清楚这个标志变量的初始化。我已经在onCreate()
Application
子类中初始化它,因为它是应用程序启动的点。但我不知道在哪里清除它。我尝试在我的MainActivity的onDestroy()
中执行此操作。但是,我发现如果system needs to free memory,onDestroy()
通常会在一个活动与另一个活动之间进行转换。因此,即使我在切换屏幕而不是实际关闭应用程序时,也会停止我的后台线程。我该如何处理这种情况?有更聪明的方法来处理这个吗?
答案 0 :(得分:0)
我认为你不必这样做:要么用户按下“主页”按钮(大多数人都这样做),那么应用程序在后台继续运行是很常见的,因此仍然可以轻松访问他们离开的状态下的用户。你要么提供一个真正杀死应用程序的“关闭应用程序”按钮,它也会杀死应用程序创建的各种线程,你不必担心。
如果你真的想要,可以捕获“主页”点击,并在返回主页之前使用它们来杀死应用程序,如果你的应用程序有0初始化时间,这是一件好事。
答案 1 :(得分:0)
But I've no idea where to clear it. I tried doing it in onDestroy() of my MainActivity.
为了知道活动是否因用户完成而被销毁(使用Back)或Android将重新创建活动,您可以使用isFinishing(); 类似的东西:
protected void onDestroy() {
super.onDestroy();
if(isFinishing()) {
// stop the news feed download
}
}
或者更好的是,停止finish()
中的Feed下载:
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.
即使活动结束,应用程序很可能仍然存在。 Android操作系统将决定何时杀死它。因此,一旦应用程序启动,您将初始化下载,然后您将在onDestroy()
或活动中的finish()
停止它,具体取决于您的需求,但如果应用程序未停止(最可能)并且你将重新进入新闻活动,你应该开始新闻下载。
我宁愿在onCreate(Bundle savedInstance)
的后台启动下载,但当savedInstance
为空时(所以我知道这是此活动的第一次创建)并停止它(如果还没有停止)已经单独在finish()
;
希望它有所帮助!
答案 2 :(得分:-1)
首先从webservice(json或xml)下载数据,你应该使用 AsyncTask (易于使用)
所以我的意思是,使用ondestroy()来清除你的旗帜,当应用程序退出时,也许你可以在按下主页按钮时抓住
在您的活动
中覆盖以下方法@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
}
现在处理这样的关键事件,
@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;
}