2012-07-24 75 views
1

我有三項活動ActivityA,ActivityB,ActivityC。從堆棧中刪除活動

假設在ActivityA,有一些類似的代碼...

if(someCondition()){ 
gotoActivityB(); 
} 
else{ 
gotoActivityC(); 
} 

現在,如果用戶進入ActivityBActivityA不應該結束。

如果他去ActivityC,它應該完成。

在清單文件中添加noHistory不起作用。

另外,finish()如果條件不起作用,因爲在ActivityA應該在後臺的ActivityC之後有很多活動。

我不想叫startActivity(context,ActivityA.class)這些活動onBackPressed()因爲,它會再次在ActivityA執行的onCreate()代碼。

那麼,有沒有辦法,當用戶在ActivityB中按下後退按鈕時,我可以從堆棧中刪除ActivityA?

可能是這樣的:?

ActivityB.this.finish(); 
ActivityA.finish(); //some code to finish ActivityA 
+1

這樣做你的應用程序關閉,如活動A是第一個活動在堆棧 – AkashG 2012-07-24 05:24:55

+0

@AkashG我知道。讓應用程序關閉 – 2012-07-24 05:36:03

+0

由於ActivityC應該在後臺的ActivityC之後有很多活動。那麼如果調用C,那麼完成A的目的是什麼? – 2012-07-24 05:39:10

回答

1

好了,這是你可以完成你的目標的方法之一。您需要將Activity上下文傳遞到您需要的任何位置,以便在其上調用finish()。我使用Application類來做到這一點。爲了時間的緣故,我只使用了兩個類來完成它,但它應該適用於您的目的。以下是我的做法:

這是第一堂課。這是我們想要從另一個活動中關閉的活動。

public class MainActivity extends Activity implements OnClickListener { 
private Button button; 
// application instance 
private MainApplication mainApplication; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mainApplication = (MainApplication) getApplicationContext(); 
    // set the Activity's context for later usage. Doing this determines which 
    // Activity can be closed from another Activity. 
    mainApplication.setActivityContext(this); 

    button = (Button) findViewById(R.id.button1); 
    button.setOnClickListener(this); 
} 

public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.button1: 
     Intent i = new Intent(this, SecondActivity.class); 
     startActivity(i); 
     break; 
    }  
} 
} 

這是第二項活動。退出出來的,還會引起完成()被稱爲第一類:

public class SecondActivity extends Activity { 

private Activity activityContext; 
private MainApplication mainApplication; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second_activity_layout); 

    mainApplication = (MainApplication) getApplicationContext(); 
    // get the Activity context you stored in the MainApplication class 
    // so you can call finish on it. 
    activityContext = mainApplication.getActivityContext(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    // closes your defined Activity. If you press the back button you will find 
    // that you exit right out of the app as the other Activity gets popped off 
    // the stack. 
    activityContext.finish(); 
} 
} 

和應用類:

public class MainApplication extends Application { 

private Activity activityContext; 

public Activity getActivityContext() { 
    return activityContext; 
} 

public void setActivityContext(Activity activityContext) { 
    this.activityContext = activityContext; 
} 

} 

過程,並確保申報的AndroidManifest您MainApplication類:

<application 
    android:name=".MainApplication" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

這是一種哈克式的方式來做到這一點。可能有更好的方法。但無論如何,你必須傳遞你想調用finish()的Activity的上下文。那麼你可以從任何地方關閉它。

+0

完美!誰在乎它是一種冒險的方式還是符合道德的方式?我的問題解決了。 – 2012-07-24 07:00:09

+0

同意。快樂編碼:) :) – 2012-07-24 15:08:51

1

嗨,你可以根據條件在當前活動中完成自己的活動。或根據結果使用StartActivityforResult,您可以完成活動。

希望這會幫助你。

+0

沒有。這並不能解決我的問題。一旦完成完整的問題。 – 2012-07-24 05:30:35

+0

您是否嘗試過startActivityforResult ?. – vinaykumar 2012-07-24 05:33:37

-1

雖然要到活動C,清除該標誌:

Intent cIntent = new Intent(view.getContext(), cActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    startActivity(cIntent); 
1

你可以用其他方式試試這個,就像我一樣。

  1. 在開始時創建活動的靜態實例變量。

    private static Activity1 thisAct = null; // Activity1 is name of class 
    
  2. 現在onCreate()方法來初始化這個變量

    thisAct = this; 
    
  3. 創建一個靜態方法,這將完成本次活動

    public static void finishActivity() 
    { 
        thisAct.finish(); 
    } 
    
+0

謝謝。但它解決了。所以,我不想再打擾一下:)\ – 2012-07-24 10:31:33