2011-02-15 43 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); 

我希望這可以幫助某人=)