首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理后台下载: Android

管理后台下载: Android
EN

Stack Overflow用户
提问于 2013-06-12 14:47:23
回答 3查看 638关注 0票数 0

我正在设计一个新闻应用程序,每当用户打开我的应用程序时,我都需要下载新鲜的文章和他们的详细故事。我是通过一个后台线程来做这一切的。我的主要关注点是,后台线程应该在用户退出应用程序时立即停止,以防止用户因此而产生额外的下载费用。

为了实现这一点,我在闪屏中启动后台下载,并不断检查让后台进程知道应用程序是否仍在运行的标志变量。

现在我的问题是:我非常清楚这个标志变量的初始化。我已经在Application子类的onCreate()中初始化了它,因为它是应用程序启动的地方。但我不知道该去哪里清理。我试着在我的MainActivity的onDestroy()中这样做。但是,我发现如果为system needs to free memory,则在一个活动到另一个活动之间的转换时经常会调用onDestroy()。因此,这样做会停止我的后台线程,即使我在屏幕之间切换,而不是真正关闭应用程序。我应该如何处理这种情况?有没有更聪明的方法来处理这件事?

EN

回答 3

Stack Overflow用户

发布于 2013-06-12 15:42:53

我不认为你必须这样做:要么是用户按下了“主页”按钮(大多数人都是这样做的),然后应用程序通常会在后台运行,因此用户仍然可以很容易地访问到他们离开的状态。要么你提供一个“关闭应用程序”按钮,它会真正杀死应用程序,这也会杀死应用程序创建的所有类型的线程,而你不必担心。

如果你真的想要,你可以捕获" home“点击,并在返回主页之前使用这些点击来杀死应用程序,如果你的应用程序没有初始化时间,这是一件很好的事情。

票数 0
EN

Stack Overflow用户

发布于 2013-06-12 17:16:32

代码语言:javascript
复制
But I've no idea where to clear it. I tried doing it in onDestroy() of my MainActivity.

为了知道该活动是因为用户完成了它而被销毁(带有Back),还是安卓将重新创建它,你可以使用isFinishing();类似于:

代码语言:javascript
复制
protected void onDestroy() {
 super.onDestroy();
 if(isFinishing()) {
 // stop the news feed download
}
}

或者更好的方法是,在finish()中停止提要下载

代码语言:javascript
复制
public void finish() {
  // stop the news feed download
  super.finish();
}

回到你上面所说的内容:

代码语言:javascript
复制
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()中停止它(如果还没有自己停止);

希望它能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2013-06-12 16:58:08

首先,为了从webservice (json或xml)下载数据,您应该使用AsyncTask (易于使用)。

所以我的意思是,当应用程序退出时,使用ondestroy()清除您的标志,也许您可以在按下home按钮时捕捉到

在您的活动中覆盖下面的方法,

代码语言:javascript
复制
@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

现在像这样处理key事件,

代码语言:javascript
复制
@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;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17059217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档