2016-01-22 34 views
0

我只用一個按鈕就可以完成簡單的活動。當按鈕被點擊時,我正在射擊意圖從圖庫中選擇圖像。當我啓動意圖然後旋轉屏幕時會發生奇怪的事情。以下是步驟:Android - 定位更改後複製「打開」系統對話框實例

  1. 單擊按鈕。出現「打開」系統對話框。
  2. 旋轉屏幕。活動被重新創建,對話框仍然顯示。注 - 我不會再次在我的活動中重新調用startActivityForResult(Intent,int)。
  3. 點擊返回按鈕。 「打開」對話框消失,但下面還有一個對話框。

因此,即使我沒有調用startActivityForResult(Intent,int),對話框的新實例也會在每個方向更改中創建,並且舊實例不會被破壞。

有沒有人遇到這個問題?如何擺脫這些重複的對話框?

更新1: 所以,這裏是一些示例代碼:

public class MainActivity extends AppCompatActivity 
{ 
    private boolean mIsStarted = false; 

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

     if (savedInstanceState != null) 
     { 
      mIsStarted = savedInstanceState.getBoolean("key"); 
     } 

     if (!mIsStarted) 
     { 
      mIsStarted = true; 
      Intent intent = new Intent(Intent.ACTION_PICK).setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MimeType.IMAGE); 
      startActivityForResult(intent, 1); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 

     outState.putBoolean("key", mIsStarted); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     mIsStarted = false; 
    } 
} 

我也試着設置android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc",仍然每次我旋轉屏幕時,(的對話框新副本其實這不是一個對話框,這是ResolverActivity)顯示在前一個頂部。這是一些Android錯誤還是隻是我做錯了什麼?

更新2:所以我嘗試了另一種方法 - 在Activity.onStop()裏面撥打finishActivity(int)。結果非常奇怪 - 現在我只有兩份ChooserActivity。第二個副本創建後,它開始正常旋轉。

下面是代碼:

public class MainActivity extends AppCompatActivity 
{ 
    private static final String LOG_TAG = MainActivity.class.getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     Log.d(LOG_TAG, "onCreate"); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     findViewById(R.id.make_photo).setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Intent intent = new Intent(Intent.ACTION_PICK).setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MimeType.IMAGE); 
       startActivityForResult(intent, 1); 
      } 
     }); 
    } 

    @Override 
    protected void onStop() 
    { 
     Log.d(LOG_TAG, "onStop"); 

     super.onStop(); 

     finishActivity(1); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     Log.d(LOG_TAG, String.format("onActivityResult[requestCode:%d, resultCode:%d, data:%s]", 
       requestCode, resultCode, data != null ? data.toString() : "NULL")); 
    } 
} 

仍然不知道爲什麼正在創建第二個副本。

回答

0

找出這是在我的基地Activity類愚蠢的錯誤。我最終得出了所有我的Activities,它與這個基類IntentProcessingActivity類的意圖一起工作。

/** 
* Base activity for all activities which process intents. This activity saves processing state 
* during recreation, so derived activities can get rid of this. This is useful for not showing 
* "Open with" dialogs multiple times. 
* <p /> 
* Derived activities can check if some intent is currently processing with {@link 
* #isProcessingIntent()} function. 
* <p /> 
* Created by Maksimov Stanislav ([email protected]) on 25.01.16 
*/ 
public class IntentProcessingActivity extends AppCompatActivity 
{ 
    private static final String KEY_IS_PROCESSING_INTENT = "IsProcessingIntent"; 

    private boolean mIsProcessingIntent; 

    @CallSuper 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     if (savedInstanceState != null) 
     { 
      mIsProcessingIntent = savedInstanceState.getBoolean(KEY_IS_PROCESSING_INTENT, false); 
     } 
    } 

    @CallSuper 
    @Override 
    protected void onSaveInstanceState(Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     outState.putBoolean(KEY_IS_PROCESSING_INTENT, mIsProcessingIntent); 
    } 

    @CallSuper 
    @Override 
    public void startActivityForResult(Intent intent, int requestCode, Bundle options) 
    { 
     mIsProcessingIntent = true; 
     super.startActivityForResult(intent, requestCode, options); 
    } 

    @CallSuper 
    @Override 
    public void startActivityForResult(Intent intent, int requestCode) 
    { 
     mIsProcessingIntent = true; 
     super.startActivityForResult(intent, requestCode); 
    } 

    @CallSuper 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     mIsProcessingIntent = false; 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

    protected final boolean isProcessingIntent() 
    { 
     return mIsProcessingIntent; 
    } 
} 

兒童Activities我只是檢查

if (!isProcessingIntent()) 
{ 
    startActivityForResult(...); 
} 
0

這在androidmanifest.xml

android:configChanges="orientation|screenSize" 

添加到活動declatation這將防止越來越重建活動和解決重複對話的問題。

+0

但如果我真的需要支持不同的方向? –

+0

忽略以前的評論,這將繼續支持定位更改 - 它將不會重新創建活動。 – AndroidMechanic

+0

即使我對不同的方向有不同的佈局? –