【问题标题】:Restart a complete Android App after a AsyncTask has finishedAsyncTask 完成后重新启动一个完整的 Android 应用程序
【发布时间】:2012-10-05 16:53:35
【问题描述】:

我正在编写的应用程序检查 /sdcard 下的目录中是否有一个特殊的 ZIP 文件,如果没有,则开始下载并解压缩它。下载和解压缩可以找到,即使是子目录。但我需要在完成后重新启动应用程序 - 这不起作用。

起初我有一个特殊的 Activity “PreMainActivity.java” 只是为了重启目的:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class PreMainActivity extends Activity
{

/**
 * 
 */
public static Boolean   ENABLE_RESTART  = false;

@Override
public void onCreate(final Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    PreMainActivity.ENABLE_RESTART = true;
    restartMain();
}

@Override
public void onRestart()
{

    super.onRestart();
    restartMain();
}

/**
 * 
 */
public void restartMain()
{

    if (PreMainActivity.ENABLE_RESTART == true)
    {
        final Intent mainIntent = new Intent(this, MainActivity.class);
        mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(mainIntent);
        finish();
    }
    else
    {
        finish();
    }
    PreMainActivity.ENABLE_RESTART = false;
}
}

然后我在 DownloadFile.java 中得到了一些代码

@Override
protected void onPostExecute(final String result)
{

    MainActivity.mProgressDialogDownload.dismiss();
    PreMainActivity.ENABLE_RESTART = true;
    final Intent i = new Intent(MainActivity.this, PreMainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(i);
}

据我研究,我需要将 MainActivity 的上下文传递给 DownloadFile.java - 但我仍然不知道如何。谁能给我一个提示,如何将上下文传递给同一包内单独文件中的 AsyncTask ?或者任何其他提示如何在 AsyncTask 完成后重新启动整个应用程序?

【问题讨论】:

  • 为什么应用完成后需要重启?
  • 因为我正在下载的代码是一个 21MB-JavaScriptCode-package,我需要在 webview 中使用它才能使应用程序正常工作 - 所以下载在应用程序首次启动后开始。但下载完成后,我需要重新加载 WebView。但是一个简单的 webview.reload() 不起作用 - 重新加载活动也 - 并且整个应用程序的重新启动在一秒钟内工作。也许不是最好的方法 - 但应用程序的用户经常会遇到在首次启动后加载一些内容并且之后必须重新加载的应用程序。所以我决定走这条路:-)
  • 好的 - 我看到你得到了一个适合你的答案,所以我不需要再详细说明 ;-)

标签: android android-asynctask restart


【解决方案1】:

您需要创建 AsyncTask 的构造函数以将当前活动上下文传递为:

   public Context ctx;

    public Your_AsyncTask_Class_Name (Context context){
        super();
        this.ctx=context;

    }
  ......
@Override
protected void onPostExecute(final String result)
{

    MainActivity.mProgressDialogDownload.dismiss();
    PreMainActivity.ENABLE_RESTART = true;
    final Intent i = new Intent(ctx, PreMainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(i);
}

您可以从 Activity 将上下文传递为:

AsyncTask_Class_Name asyktaskobj=new AsyncTask_Class_Name(this);
asyktaskobj.execute(); 

【讨论】:

  • 是的!现在我明白了!它按预期工作 - 非常感谢! :-)
【解决方案2】:

只需像这样重新启动您的 main.activity:

Intent intent = getIntent(); 
finish(); 
startActivity(intent);

查看问题: How do I restart an Android Activity

【讨论】:

  • 不幸的是,此代码片段可在 MainActivity 内工作 - 但不能在 AsyncTask 类下面的方法内工作。不管怎样,谢谢你的帖子——我会记住的,也许我在另一个项目中需要这个:-)
猜你喜欢
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多