2013-05-18 26 views
5

Vâng, tôi đang triển khai trung tâm trò chơi mới trong android và có một khái niệm mà tôi không hiểu.cách chuyển dữ liệu trung tâm trò chơi giữa các hoạt động?

Tôi có một lớp học mở rộng BaseGameActivity (https://developers.google.com/games/services/android/init), vì vậy đó là người quản lý thành tích, bảng xếp hạng, Google + đăng nhập, v.v. Tôi cần một lớp khác để có thể truy cập dữ liệu của trung tâm trò chơi từ hoạt động đó (mở khóa thành tích, bảng thành tích, vv), nhưng lớp này không được gọi từ lớp BaseGameActivity mở rộng.

Họ có thể giao tiếp bằng cách nào?

Cấu trúc là như thế này (có nghĩa là "->" mà nó bắt đầu hoạt động khác)

A (mở rộng BaseGameActivity) -> B -> C (cần truyền thông trung tâm trò chơi với A)

Tôi có đọc ví dụ của google (TypeANumber) nhưng nó sử dụng một Listener để giao tiếp, thật dễ dàng khi lớp bạn cần giao tiếp là lớp mà bạn đang bắt đầu, nhưng nó không dễ dàng với cấu trúc của tôi.

Bất kỳ ý tưởng nào?

Cảm ơn

+0

chưa xem xét các tài liệu nhưng bạn có thể đặt dữ liệu bạn cần dưới dạng Phụ trang trong 'Intent' không? – edthethird

+0

Vâng, một điều bạn có thể thử làm là thay vì mở rộng BaseGameActivity đang xem cách chúng triển khai nó và sau đó đặt GamesCient đó ở cấp cơ sở của ứng dụng của bạn. Có vẻ như với phần xác thực, GamesClient sẽ yêu cầu một hoạt động, nhưng tôi chắc chắn bạn có thể tìm cách khởi tạo ứng dụng trò chơi cho ứng dụng toàn cầu từ hoạt động ban đầu của bạn khá dễ dàng. – dmason82

Trả lời

5

gì tôi nghĩ là bạn có 3 lựa chọn:

  1. Tạo một GamesClient cho mỗi Hoạt động mà cần nó, nhưng bạn phải gọi connect() cho từng hoạt động, và phải mất thời gian. Sau kết nối đầu tiên, các kết nối khác nhanh hơn nhiều (vài trăm mili giây)
  2. Tạo lớp Ứng dụng của riêng bạn và sử dụng nó như một ngữ cảnh cho GamesClient.Builder, và lưu trữ đối tượng GamesClient của bạn trong lớp Ứng dụng của bạn. Tôi đã thử nghiệm nó, và nó hoạt động. Bây giờ, tôi biết không nên làm điều đó (vì nó phá vỡ triết lý của Android) nhưng có vẻ như rất nhiều người thích tạo lớp ứng dụng của riêng họ và lưu trữ dữ liệu vào nó thay vì gộp dữ liệu và chuyển chúng từ hoạt động này sang hoạt động khác. Ưu điểm chính của nó là bạn không phải sửa đổi nhiều thứ để làm cho nó hoạt động trong trường hợp của bạn (và trong tôi).
  3. Sử dụng lớp Phân đoạn thay vì lớp Hoạt động và sử dụng Hoạt động chính sở hữu đối tượng GamesClient (trong trường hợp đó, lớp C của bạn sẽ có thể giao tiếp với lớp A). Giống như trong ví dụ bạn đang đề cập, chỉ có một Hoạt động được kế thừa từ ví dụ BaseGameActivity của Google (có chứa phiên bản GamesClient) và phần còn lại chỉ là các lớp Fragment (mỗi Fragment là một màn hình).
+0

Cảm ơn, tôi đã giải quyết nó bằng cách sử dụng tùy chọn đầu tiên. –

0

Cách đóng gói tất cả dữ liệu cần chia sẻ thành một đối tượng đơn lẻ, ví dụ:

class SharedData { 
    public String aString; 
    public double aDouble; 
    // etc 
    public static SharedData globalInstance = new SharedData(); 
} 

và sau đó tất cả các phần của ứng dụng của bạn có thể truy cập qua SharedData.globalInstance.

+0

Singletons là một antipattern. Tôi sẽ không khuyến khích điều này. Tốt hơn để sử dụng các đối tượng ứng dụng nếu bạn đi xuống tuyến đường này hơn là xác định một dữ liệu được chia sẻ singleton – 0909EM

+1

@ 0909EM Tôi không chắc chắn những gì bạn có nghĩa là bởi một antipattern? [Tài liệu cho đối tượng ứng dụng] (http://developer.android.com/reference/android/app/Application.html) thậm chí đề cập đến những người độc thân. Trong mọi trường hợp, tôi đồng ý rằng việc sử dụng đối tượng ứng dụng đạt được cùng một mục tiêu. – Stochastically

+0

Xin lỗi vì đã chỉ cho bạn tại wikipedia (một trong những tài nguyên tốt nhất hoặc rất tệ nhất) http://en.m.wikipedia.org/wiki/Singleton_pattern Tôi đã có những trải nghiệm hỗn hợp với Singletons đôi khi hữu ích và đôi khi là một sod kiểm tra ... chỉ muốn chỉ ra rằng những người độc thân đôi khi được coi là một mô hình chống – 0909EM

1

Cách đơn giản nhất để chia sẻ GamesClient giữa nhiều màn hình trong trò chơi là sử dụng Phân đoạn, mà tôi đã cố gắng minh họa trong mẫu TypeANumber.

Điều đó nói rằng, nếu bạn vẫn muốn có nhiều Hoạt động, mỗi hoạt động phải quản lý đối tượng GamesClient của riêng đối tượng, bởi vì GamesClient được gắn với một Hoạt động cụ thể. Do đó, nếu bạn đang sử dụng mã mẫu, thì mỗi Hoạt động sẽ phải lấy được từ BaseGameActivity và mỗi trong số chúng sẽ nhận được onSignInSucceeded().Trong mỗi người trong số họ, bạn có thể sử dụng getGamesClient() để có được đối tượng GamesClient cho rằng hoạt động.

+0

Cảm ơn Bruno, đó là những gì tôi cuối cùng đã làm. Có lẽ lần sau tôi sẽ cố gắng triển khai Fragments –

+1

Thật không may là không phải lúc nào cũng khả thi để có một Hoạt động với Phân đoạn. Cũng không thực sự mở rộng một lớp cơ sở; mỗi thư viện của bên thứ ba dường như giả sử bạn chỉ có thể mở rộng lớp cơ sở của họ, nhưng Java có thừa kế đơn và tôi cũng có thể muốn sử dụng các thư viện khác nhau cùng một lúc. Tôi thực sự muốn có một vòng đời ứng dụng cho những loại trường hợp này. –

0

Chỉ cần ý tưởng ... Tôi đã không nhìn vào mã để điều trị này với một pince muối ..

Bạn có thể gói gọn trong một bưu kiện có thể/serializable và sau đó sử dụng thiết lập/getparceable trong mỗi hoạt động cần nó? Tôi khuyên bạn nên chuyển giao diện xuống, nhưng không chắc chắn mức độ dễ dàng mà không cần xem mã

Hoặc bạn có thể bao bọc logic ứng dụng khách trong một dịch vụ mà bạn có thể tương tác với mỗi hoạt động không?

+0

Không, nó không phải là Serializable hoặc Parcelable. Những gì tôi đã cố gắng đạt được là đăng nhập một lần, và cố gắng gửi dữ liệu đến hoạt động mà tôi đã đăng nhập. Giải pháp duy nhất là sử dụng các đoạn. –

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