2012-03-05 25 views
6

Tôi có một hành vi lạ trong đơn đăng ký thay đổi hướng của tôi.Ví dụ thứ hai của hoạt động sau khi thay đổi hướng

Hành vi thông thường:
Khi tôi mở ứng dụng, hoạt động tại nhà của tôi bắt đầu. Khi tôi đi đến hoạt động tiếp theo (một thư viện) nó được bắt đầu bình thường (với một hình ảnh động trượt từ phải sang trái). Khi tôi quay trở lại bằng cách sử dụng phím quay lại, hoạt động hiện tại (thư viện) đã hoàn thành (với hoạt ảnh trượt từ trái sang phải).

Hành vi lạ:

  • Khi tôi bắt đầu ứng dụng ở chế độ dọc và thay đổi định hướng đến cảnh quan. Sau đó, có một cái gì đó giống như một ví dụ thứ hai của hoạt động nhà. Bởi vì sau đó nhấn nút quay lại ở chế độ ngang không đóng ứng dụng như nó sẽ không thay đổi orienation (hoạt động gia đình là hoạt động đầu tiên trong ứng dụng của tôi) nhưng rahter tạo hoạt ảnh trượt từ trái sang phải (như bắt đầu một hoạt động mới) và cho thấy hoạt động tại nhà (nhưng tôi lại nghĩ một trường hợp khác). Nhấn nút quay lại lần thứ hai sẽ đóng ứng dụng.
  • Khi tôi khởi động ứng dụng ở chế độ ngang và thay đổi chế độ chân dung thành chế độ dọc, nhấn nút quay lại sẽ tạo ra hình động từ phải sang trái (như đóng hoạt động) và hiển thị lại hoạt động ở nhà.
  • Khi tôi khởi động ứng dụng và thực hiện hai thay đổi định hướng dọc theo chiều ngang dọc, sau đó nút quay lại đóng ứng dụng như mong muốn.

Vì vậy, nó giống như cảnh quan và chế độ dọc được xử lý như hai hoạt động khác nhau.

Tôi không sử dụng android:configChanges="orientation|keyboardHidden|screenSize", do đó, thay đổi định hướng phải tuân theo vòng đời hoạt động bình thường của Android và hủy phiên bản hoạt ảnh (hoặc phong cảnh) "cũ" của hoạt động.
Các hoạt động của tôi được kế thừa từ FragmentActivity. Tôi đang sử dụng onSaveInstanceState để chuyển một nội dung (không chứa bất kỳ tham chiếu nào đến hoạt động) và tôi đang sử dụng onRetainCustomNonConfigurationInstance (read here) để chuyển một số AsyncTask s. Nhưng tất cả các tham chiếu trong các tác vụ này (nếu có) sẽ bị hủy trong onRetainCustomNonConfigurationInstance và được khôi phục (với hoạt động mới được tạo) sau getLastCustomNonConfigurationInstance.

Bất kỳ ý tưởng nào có thể gây ra hành vi này?

EDIT:
Hoạt động Tuyên bố trong Manifest-File:
<activity android:name=".activities.smartphone.HomeSmartphone" android:label="@string/app_name"></activity>

HomeSmartphone mở rộng Home
Trang chủ mở rộng MyFragmentActivity
MyFragmentActivity kéo dài android.support.v4.app.FragmentActivity

Trong MyFragmentActivity Tôi chỉ làm một số công cụ đăng nhập/theo dõi trong onCreate, onRestart, onStart, onSaveInstanceState, onPause, onResu tôi, onStop, onDestroy bằng cách gọi một số phương thức tĩnh của một lớp theo dõi, mà chỉ giữ một tham chiếu đến ngữ cảnh ứng dụng. Không theo ngữ cảnh hoạt động.

Trang chủ là lớp trừu tượng được mở rộng bởi HomeSmartphone và HomeTablet.Hai lớp này chỉ làm một số tải/làm mới/initalizing đặc biệt trong các bố trí khác nhau.

Nhiệm vụ nhất được thực hiện trong lớp Trang chủ trừu tượng.



    public HomeRetainedObjects retained = new HomeRetainedObjects(); 

    public boolean adIsShown = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.home); 

     Log.i("DEBUG", "onCreate(Home)"); 

     if (savedInstanceState != null) { 
      this.adIsShown = savedInstanceState.getBoolean("adIsShown"); 
     } 

    // write/update values in shared preferences 
     this.initPreferences(); 

    // recover retained objects (mostly AsyncTasks) 
     this.recoverRetained(); 

    // show content/refresh content 
     this.init(); 
    } 

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

     outState.putBoolean("adIsShown", this.adIsShown); 

     Log.i("DEBUG", "onSaveInstanceState(Home)"); 
    } 

    public void recoverRetained() { 
     Object retained = this.getLastCustomNonConfigurationInstance(); 
     if (retained instanceof HomeRetainedObjects) { 
      this.retained = (HomeRetainedObjects) retained; 

      if (this.retained.loadMessageTask != null) { 
       this.retained.loadMessageTask.restoreContext(this); 
      } 
     } 
    } 

    @Override 
    public Object onRetainCustomNonConfigurationInstance() { 
     if (this.retained.loadMessageTask != null) { 
      this.retained.loadMessageTask.destroyContext(); 
     } 

     return this.retained; 
    } 

Tôi hy vọng điều này sẽ giúp ?!

+0

hiển thị mã cho chúng tôi ... –

+0

... bao gồm khai báo Hoạt động trong tệp kê khai của bạn, plz. – Turnsole

+3

+1 cho câu hỏi được đặt ra tốt cho chúng ta thấy những nỗ lực của bạn :) –

Trả lời

0

Tôi gặp sự cố tương tự và dường như nguyên nhân của sự cố của bạn là ghi đè onRetainCustomNonConfigurationInstance().

Tôi đã xem xét đối tượng trạng thái lưu giữ của mình và thấy rằng nó đang giữ tham chiếu đến một số Context. Tôi bọc nó trong một WeakReference và hành vi bình thường trở lại và không có trường hợp đôi lạ lingered về.

Có lẽ trạng thái lưu giữ của bạn cũng đang giữ tham chiếu đến một số Context?

Các vấn đề liên quan