Tôi đang gặp phải một vấn đề rất khó hiểu đối với một số lượng rất nhỏ người dùng của mình. Lỗi xảy ra khi một nút được nhấn bên trong một Mảnh, bắt đầu một Hoạt động Phân đoạn khác. Dưới đây là stack trace:Hoạt động phân đoạn - ứng dụng đã chết, không có trạng thái đã lưu
I/20:22:23.901 ActivityManager(1668)
Start proc com.brandall.nutter for activity com.brandall.nutter/.ActivityHomeFragment: pid=8956 uid=10125 gids={50125, 3003, 3001, 3002, 1015, 1023, 1006, 1028}
I/20:22:23.881 WindowState(1668)
WIN DEATH: Window{41ed1948 u0 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment}
W/20:22:23.881 ActivityManager(1668)
Force removing ActivityRecord{411c4188 u0 com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state
I/20:22:23.881 WindowState(1668)
WIN DEATH: Window{41b6a178 u0 Toast EXITING}
W/20:22:23.881 InputDispatcher(1668)
Attempted to unregister already unregistered input channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)'
W/20:22:23.871 ActivityManager(1668)
Scheduling restart of crashed service com.brandall.nutter/.TTSS in 80000ms
I/20:22:23.871 ActivityManager(1668)
Process com.brandall.nutter (pid 8907) has died.
I/20:22:23.871 WindowState(1668)
WIN DEATH: Window{411d4ff0 u0 com.brandall.nutter/com.brandall.nutter.ActivityHomeFragment}
E/20:22:23.871 InputDispatcher(1668)
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Channel is unrecoverably broken and will be disposed!
W/20:22:23.871 InputDispatcher(1668)
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Consumer closed input channel or an error occurred. events=0x9
Do dòng này của lỗi:
com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state
Tôi đã đọc nhiều bài viết về bang Fragment lưu, nhưng không ai dường như áp dụng trong hoàn cảnh của tôi, chứ không phải cho chính Phân đoạn, không được đề cập trong theo dõi ngăn xếp. Các bài đăng khác đề xuất thêm vào từng Phân đoạn:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
Tôi hiện không ghi đè phương pháp onCreate trong bất kỳ đoạn nào của tôi.
Tôi cũng thấy đề nghị này thêm vào mỗi Fragment:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
setUserVisibleHint(true);
}
Ngoài thực tế là nó chỉ xảy ra với một số lượng rất nhỏ người dùng, vấn đề khó hiểu nhất là với bối cảnh sử dụng:
final Intent sa = new Intent(getActivity(), ActivityLinkAppsFragment.class);
getActivity().startActivity(sa);
Ứng dụng của tôi có dịch vụ nền trước và nếu tôi sử dụng bối cảnh tĩnh (thông qua phương thức getServiceContext tĩnh) trong Intent ở trên, sự cố không còn xảy ra đối với người dùng và Hoạt động phân đoạn mở chính xác .
Tôi không hiểu tại sao việc sử dụng một bối cảnh khác nên ngăn sự cố xảy ra, nhưng tôi hy vọng với thông tin tôi đã cung cấp, điều đó sẽ hợp lý với ai đó!
Tôi có thể cung cấp mã FragmentPagerAdapter mà tôi đang sử dụng nếu nó chứng minh là có liên quan, nhưng nó khá chuẩn.
tôi cảm ơn bạn trước
EDIT - Một cái gì đó rất quan trọng tôi quên thêm. Điều này không làm cho ứng dụng gặp sự cố. Thay vào đó là Hoạt động mà từ đó Phân đoạn được đưa vào, được khởi động lại ngay lập tức.
TRẢ LỜI - Điều này là do tôi gọi System.exit(0)
trong những trường hợp tôi nghĩ chỉ có thể khi người dùng muốn 'xóa' mức sử dụng bộ nhớ của ứng dụng. Tôi đã sai và nó cũng có thể được gọi khi thiết bị của người dùng xử lý các điều kiện bộ nhớ thấp. @ Beworker của câu trả lời dưới đây được đánh dấu là chính xác, như ông lưu ý ActivityManagerService.handleAppDiedLocked()
đó là kết quả của việc này.
Điều này vẫn xảy ra nếu bạn sử dụng mẫu đề xuất đăng ký người nghe trong 'Hoạt động' và xử lý' startActivity' ở đó?'Fragments' sẽ không bao giờ bắt đầu ở đó sở hữu' Hoạt động' bởi vì không có cách nào để chúng biết được liệu một Activity nên được khởi động hay một Fragment sẽ được thêm vào/thay thế. Ngoài ra, tại sao bạn sử dụng 'Intent.FLAG_ACTIVITY_NEW_TASK' ở đây? –
@PaulBurke Cờ không nên ở đó - Xin lỗi vì đã bị lỗi, nó bị bỏ lại trong thử nghiệm của tôi, tôi sẽ xóa nó khỏi câu hỏi. Khi tôi xử lý các hoạt động của mình như một đống rất đơn giản, tôi chưa bao giờ phải cân nhắc xem có nên bắt đầu chúng hay không. Tôi sẽ tìm kiếm cách tiếp cận người nghe mà bạn mô tả. Cảm ơn bạn. – brandall
@brandall bạn có thể chia sẻ các phương thức 'onClick()' và vòng đời của Fragment không? –