为什么这个课程两次启动意图?

时间:2014-03-15 23:08:38

标签: android android-intent

我使用AsyncTask执行SplashScreen活动来检查文件是否存在。如果它们存在,则启动MainActivity类else启动Downloader类。

问题是当splashscreen完成时,它会运行MainActivity意图两次或Downloader意图两次。我使用的是Android版GINGERBREAD

package com.example.myapp;

import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.Window;
import android.view.WindowManager;

public class SplashScreen extends Activity {

// base path of application
private final String basePath =  Environment.getExternalStoragePublicDirectory("MyApp").getAbsolutePath() +
                            "/files";
// files to check
private final String[] filenames = {
    "file1.txt",
    "file2.txt",
};

private boolean isOK = false;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    setContentView(R.layout.activity_splash);

    Thread background = new Thread() {
        public void run() {

            try {
                // Thread will sleep for 5 seconds
                sleep(5 * 1000);

                // After 5 seconds redirect to another intent
                // If is ok to start
                if (isOK) {
                    Intent i = new Intent(getBaseContext(), MainActivity.class);
                    startActivity(i);
                }
                // Else download required files
                else {
                    Intent i = new Intent(getBaseContext(), DownloadScreen.class);
                    startActivity(i);
                }

                //Remove activity
                finish();

            } catch (Exception e) {

            }
        }
    };

    // check if all required files exists
    new CheckFiles().execute(filenames);

    // start thread
    background.start();
}

@Override
public void onBackPressed() {
    android.os.Process.killProcess(android.os.Process.myPid());
}

private class CheckFiles extends AsyncTask<String, Void, Boolean> {

    @Override
    protected Boolean doInBackground(String... filenames) {

        for (String filename : filenames) {
            File file = new File(basePath + filename);

            if (file.exists())
                continue;
            else return false;
        }

        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        isOK = result;
    }

}
}

2 个答案:

答案 0 :(得分:0)

这种情况发生的原因是,当您{SpladerScreen®活动finish()时,它会通过重新创建它回到您的MainActivity,这意味着它会再次呼叫onCreate(),如果您没有&#39} ; t停止了你之前的Thread,它会启动另一个,所以它会为同一件事开始两个意图。

----编辑----

要检查Thread是否正在运行,我建议在类范围内定义一个boolean变量来控制它。将其设置为false,一旦进入,请将其设置为true

然后,在.start()上致电Thread之前,请检查变量是否为false。如果是这样, 称之为,否则,不要这样做,因为它将启动另一个实例并将被复制。

// start thread
if (!isAlreadyStarted)
  background.start();

答案 1 :(得分:0)

你在做什么看起来很奇怪和坏。你有一个背景Thread来检查睡眠后的值,看起来是什么,是一个任意的时间。您可以删除Thread并将该代码放入函数中。然后,当任务在onPostExecute()结束时,您可以调用此函数。像

这样的东西
protected void onPostExecute(Boolean result) {
    goToActivity(result);
}

private void goToActivity(boolean ok)
{
    isOK = ok;
    Intent i;
    if (isOK) {
       i = new Intent(getBaseContext(), MainActivity.class);
    }
    // Else download required files
    else {
      i = new Intent(getBaseContext(), DownloadScreen.class);
    }
    startActivity(i);
    //Remove activity
    finish();
}