Gần đây tôi đã quyết định xem xét kỹ hơn Cấu phần Kiến trúc Android mới mà Google đã phát hành, đặc biệt là sử dụng lớp nhận thức vòng đời ViewModel của họ cho kiến trúc MVVM và LiveData.MVVM pattern và startActivity
Miễn là tôi đang xử lý một Hoạt động hoặc một Phân đoạn, mọi thứ đều ổn.
Tuy nhiên, tôi không thể tìm thấy giải pháp tốt để xử lý Chuyển đổi hoạt động. Giả sử, ví dụ: Hoạt động A có nút để khởi chạy Hoạt động B.
Xử lý startActivity() ở đâu?
Theo mẫu MVVM, logic của clickListener phải ở trong ViewModel. Tuy nhiên, chúng tôi muốn tránh tham chiếu đến Hoạt động ở đó. Vì vậy, việc chuyển ngữ cảnh sang ViewModel không phải là một tùy chọn.
Tôi đã thu hẹp một số tùy chọn có vẻ "OK", nhưng không thể tìm thấy bất kỳ câu trả lời thích hợp nào cho "đây là cách thực hiện".
Tùy chọn 1: Có enum trong ViewModel với ánh xạ giá trị để định tuyến có thể (ACTIVITY_B, ACTIVITY_C). Kết hợp với LiveData. Hoạt động sẽ quan sát LiveData này và khi ViewModel quyết định rằng ACTIVITY_C sẽ được khởi chạy, nó sẽ chỉ postValue (ACTIVITY_C). Hoạt động sau đó có thể gọi startActivity() bình thường.
Tùy chọn 2: Mẫu giao diện thông thường. Cùng nguyên tắc như tùy chọn 1, nhưng Activity sẽ thực hiện giao diện. Tôi cảm thấy một chút khớp nối với điều này mặc dù.
Tùy chọn 3: Tùy chọn nhắn tin, chẳng hạn như Otto hoặc tương tự. ViewModel gửi một Broadcast, Activity chọn nó và khởi động những gì nó có. Chỉ có vấn đề với giải pháp này là, theo mặc định, bạn nên đặt thanh ghi/hủy đăng ký của Broadcast đó bên trong ViewModel. Vì vậy, không giúp đỡ.
Tùy chọn 4: Có một lớp định tuyến lớn, ở đâu đó, như đơn hoặc tương tự, có thể được gọi để gửi định tuyến có liên quan đến bất kỳ hoạt động nào. Cuối cùng qua giao diện? Vì vậy, mọi hoạt động (hoặc một BaseActivity) sẽ thực hiện
IRouting { void requestLaunchActivity(ACTIVITY_B); }
Phương pháp này chỉ làm tôi lo lắng một chút khi ứng dụng của bạn bắt đầu có rất nhiều mảnh vỡ/hoạt động (vì lớp Routing sẽ trở thành khổng lồ)
Vì vậy, đó là nó. Đó là câu hỏi của tôi. Các bạn xử lý như thế nào? Bạn có lựa chọn mà tôi không nghĩ đến không? Bạn cho rằng tùy chọn nào phù hợp nhất và tại sao? Phương pháp tiếp cận được Google đề xuất là gì?
PS: Liên kết điều đó không làm cho tôi bất cứ nơi nào 1-Android ViewModel call Activity methods 2-How to start an activity from a plain non-activity java class?
Cảm ơn. Vui mừng được giúp bạn :-) –