2012-03-09 99 views
1

我想有一個任務歷史堆棧這種行爲:Android的任務歷史堆棧:可以有「重複的活動」?

  • 首要任務歷史堆棧是:
    • 場景1.1:活動首頁 - >活性A - > b活動
  • 接着,活動乙啓動活性的,相同的實例
    • 方案1.2:主 - > A - >乙 - > A(一式兩份)

這樣,如果用戶按下返回按鈕,他回到B,並且再次按下按鈕返回到A(始終是A的同一個實例)。

使用意圖標誌 「FLAG_ACTIVITY_REORDER_TO_FRONT」 我已經實現的行爲:

  • 第一:
    • 場景2.1:首頁 - >甲 - >乙
  • 乙啓動一個
    • 場景2.2:主 - >乙 - >甲

所以同一個實例實際上是帶到前面,但讓b與後退按鈕後,A是B和主之間不再,所以顯示主。

  1. 是否有任何標誌/活動屬性左右,可以簡化實現這種行爲?
  2. 或者我需要處理的活動「後退按鈕按下」?
    • 如果是這樣,假設我在場景2.2,我怎麼能重新排序把它放在主要與B之間(檢測後退按鈕之後)?
  3. 任何其他的意見/建議將不勝感激。

謝謝!

回答

2

我認爲你需要的情況下,通常是Tasks and Back Stack impossible.Because說:

當用戶按下後退按鈕,當前的活動是從堆棧的頂部彈出 (活性被破壞)

所以,如果你的任務是A - >乙 - >(一式兩份)和用戶按下後退按鈕時,他又回到B和A的破壞,他不能回去給A.
我寫樹活動A,A1,A2具有此行爲:
首頁 - > A - > A1 - > A2 - > A1(複製)
接下來,當用戶返回在A2按:
A1 - > A2 - > A1(相同) - > A - >主
這是他們的代碼:
活動A爲:

package t.t; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class TaskTestActivity extends Activity { 
    Button btn; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main0); 
     btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Intent i = new Intent(TaskTestActivity.this, TaskTestActivity1.class); 
       i.putExtra("loader", "A"); 
       TaskTestActivity.this.startActivity(i); 
      } 
     }); 
    } 
}  

活動A1是:

package t.t; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.Button; 
import android.widget.EditText; 

public class TaskTestActivity1 extends Activity { 
    Button btn; 
    String str = ""; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main1); 
     btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Intent i = new Intent(TaskTestActivity1.this, TaskTestActivity2.class); 
       i.putExtra("loader", "A1"); 
       TaskTestActivity1.this.startActivity(i); 
      } 
     }); 
    } 
    @Override 
    public void onBackPressed() { 
     System.out.println(str); 
     if(str.equals("ali")){ 
      Intent i = new Intent(this,TaskTestActivity2.class); 
      this.startActivity(i); 
      str = ""; 
      System.out.println("BACK"); 
     }else{ 
      Intent i = new Intent(this,TaskTestActivity.class); 
      this.startActivity(i); 
      str = ""; 
      System.out.println("BACK1"); 
     } 

    } 
    @Override 
    protected void onNewIntent(Intent intent) { 
     // TODO Auto-generated method stub 
     super.onNewIntent(intent); 
     str = "ali"; 
    } 

} 

活動A2是:

package t.t; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.Button; 
import android.widget.EditText; 

public class TaskTestActivity2 extends Activity { 
    Button btn; 
    int i = 0; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Intent i = new Intent(TaskTestActivity2.this, 
         TaskTestActivity1.class); 
       i.putExtra("loader", "A2"); 
       TaskTestActivity2.this.startActivity(i); 
      } 
     }); 

    } 
}  

請注意,我在活動A1覆蓋onBackPressed(),你會檢測要回A2或A,所以我額外加給的意圖並覆蓋onNewIntent(意向意圖)在A1.My項目清單是:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="t.t" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" android:hardwareAccelerated="true"> 
     <activity 
      android:label="A" 
      android:launchMode="standard" 
      android:name=".TaskTestActivity" > 
      <intent-filter > 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:label="A2" 
      android:launchMode="singleInstance" 
      android:name=".TaskTestActivity2" > 
     </activity> 
     <activity android:name="TaskTestActivity1" android:launchMode="singleTask" android:label="A1"></activity> 
    </application> 

</manifest> 

關注「singleInstance」和「singleTask」活動elements.Finally屬性,你可以使用此佈局,爲您的活動,以確保A1是複製:

的main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

    <TextView 
     android:id="@+id/textView3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="A2" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <RatingBar 
     android:id="@+id/ratingBar1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

main1.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="A1" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 





    <RatingBar 
     android:id="@+id/ratingBar1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

main0.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 



    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="A" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

</LinearLayout> 
0

您可以嘗試使用finish();你開始你的新右後活動:

startActivity(intent); 
finish();