0

我正在设计一个新闻应用程序,每当用户打开我的应用程序时,我都需要在其中下载新鲜文章及其详细故事。我正在做所有这些都是后台线程。我的主要关注点是,一旦用户退出应用程序,后台线程应该停止,以防止用户产生额外的下载费用。

为此,我在初始屏幕中启动后台下载,并继续检查标志变量,让后台进程知道应用程序是否仍在运行。

现在我的问题是:我很清楚这个标志变量的初始化。我已经在子类中初始化了它,onCreate()因为Application它是应用程序启动的地方。但我不知道在哪里清除它。我尝试在onDestroy()我的 MainActivity 中这样做。但是,我发现如果系统需要释放内存onDestroy(),通常会在一个活动到另一个活动之间的转换时调用它 。因此,即使我在屏幕之间切换并且没有真正关闭应用程序,这样做也会停止我的后台线程。我应该如何处理这种情况?有没有更聪明的方法来处理这个?

4

3 回答 3

0

我认为您不必这样做:要么用户按下“主页”按钮(大多数人都会这样做),然后应用程序通常会在后台继续运行,因此用户仍然可以轻松访问在他们离开它的状态下。要么你提供一个“关闭应用程序”按钮,它真的会杀死应用程序,这也会杀死应用程序创建的每一种线程,你不必担心。

如果您真的想要,您可以捕获“主页”点击,并在返回主页之前使用这些点击杀死应用程序,如果您的应用程序的初始化时间为 0,这是一件好事。

于 2013-06-12T07:42:53.443 回答
0
But I've no idea where to clear it. I tried doing it in onDestroy() of my MainActivity.

In order to know if the activity is destroyed because the user finished it (with Back) or Android will re-create it, you could use isFinishing(); Something like:

protected void onDestroy() {
 super.onDestroy();
 if(isFinishing()) {
 // stop the news feed download
}
}

Or better, stop the feed download in finish():

public void finish() {
  // stop the news feed download
  super.finish();
}

To go back to what you said above with:

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.

Even if the activity is finished, the application is very probable to still live. The Android OS will decide when to kill it. So you will initialize the download once the app starts, then you will stop it on onDestroy() or on finish() within Activity, depending on your desire, but if the application doesn't stop (most probable) and you're re-entering again in the news activity you should be starting the news download.

I would rather initiate the download in the background in onCreate(Bundle savedInstance), but when savedInstance is null (so I know this is the first create of this activity) and stop it (if hasn't stopped already by itself) in finish();

Hope it helps!

于 2013-06-12T09:16:31.593 回答
-1

首先从 web 服务(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;
}
于 2013-06-12T08:58:08.310 回答