2011-02-15 42 views
59

我有一个Android应用程序。我正在制作一个带有进度条的加载屏幕。如何在Android中完成当前活动

我在onCreate方法中输入了一个延迟。当计时器结束时,我想完成当前的活动并开始一个新的活动。

它只是给我一个例外,当它调用finish()方法。

public class LoadingScreen extends Activity{ 
    private LoadingScreen loadingScreen; 
    Intent i = new Intent(this, HomeScreen.class); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.loading); 

     CountDownTimer timer = new CountDownTimer(10000, 1000) //10 second Timer 
     { 
      public void onTick(long l) 
      { 

      } 

      @Override 
      public void onFinish() 
      { 
       loadingScreen.finishActivity(0); 
       startActivity(i); 
      }; 
     }.start(); 
    } 
} 

如何变更代码,以便当进度条完成它结束?

+1

尝试loadingScreen.finish(); – sat 2011-02-15 07:21:00

+0

这就解决了我的问题 http://stackoverflow.com/questions/23574666/countdowntimer-inside-popup – Sam 2016-07-18 13:55:22

回答

108

如果您正在执行加载屏幕,只需将该参数设置为不保留在活动堆栈中即可。在你的manifest.xml,在那里你定义您的活动做:

<activity android:name=".LoadingScreen" android:noHistory="true" ... /> 

并在代码中没有必要),再调用.finish(。只要做startActivity(i);

也不需要将您当前活动的实例保留在单独的字段中。您可以随时访问它,如LoadingScreen.this.doSomething()而不是private LoadingScreen loadingScreen;

+0

使用startActivity和startActivityForResult结束活动。它今天咬我; D – Zhen 2014-08-25 15:15:51

10

您需要从UI线程调用finish(),而不是后台线程。做到这一点的方法是声明一个Handler并让Handler在UI线程上运行一个Runnable。例如:

public class LoadingScreen extends Activity{ 
    private LoadingScreen loadingScreen; 
    Intent i = new Intent(this, HomeScreen.class); 
    Handler handler; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     handler = new Handler(); 
     setContentView(R.layout.loading); 

     CountDownTimer timer = new CountDownTimer(10000, 1000) //10seceonds Timer 
     { 
      @Override 
      public void onTick(long l) 
      { 

      } 

      @Override 
      public void onFinish() 
      { 
       handler.post(new Runnable() { 
        public void run() { 
         loadingScreen.finishActivity(0); 
         startActivity(i); 
        } 
       }); 
      }; 
     }.start(); 
    } 
} 
+0

@AndreiBuneyeu - 有一个一般规则(声明[这里](http://developer.android.com/guide/components/processes-and-threads.html#Threads)):“不要从UI线程外部访问Android UI工具包“。虽然术语“Android用户界面工具包”没有在文档中的任何位置定义(我可以找到),但将活动生命周期方法视为其一部分似乎是合理的。 (很明显,一些'Activity'方法 - 像'Activity.runOnUiThread(Runnable)' - 不属于这个限制。我同意你的意见,这些文档不太清楚,因为他们需要关于这个主题。) – 2012-12-19 18:13:46

42

我试过使用这个例子,但它失败了。每次我用来调用处理程序中的finish()/ finishactivity()时,我最终会遇到这个威胁性的java.lang.IllegalAccess Exception。我不确定那个提出问题的人是如何工作的。

相反,我找到了解决办法是,在您的活动创建一个方法,如

void kill_activity() 
{ 
    finish(); 
} 

从处理程序的运行方法中调用此方法。这对我来说就像一个魅力。希望这可以帮助任何与“如何从不同线程关闭活动?”挣扎的人。

+3

这是一个问题,而不是一个答案。 – untill 2015-04-16 14:05:18

8

只要打电话给finish()方法:

context.finish(); 
6

当你要开始一个新的活动和完成当前的活动,你可以这样做:

API为11或更大

Intent intent = new Intent(OldActivity.this, NewActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 

API 10或更低

Intent intent = new Intent(OldActivity.this, NewActivity.class); 
intent.setFlags(IntentCompat.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 

我希望这可以帮助某人=)