2012-11-19 25 views
10

thể trùng lặp:
How do I pass data between activities in Android?Làm thế nào để bạn chia sẻ các biến với các hoạt động khác một cách dễ dàng?

Tôi đang làm cho một trò chơi thẻ và tôi có một hoạt động cho thẻ loại bỏ và một hoạt động cho thấy điểm số. Vấn đề là tôi muốn chuyển một số đối tượng (tay người chơi và người chia bài) sang hoạt động khác để tôi có thể thiết lập imageViews trong điểm số thành các lá bài trong tay người chơi. Tôi có thể làm cái này như thế nào? Tôi không quan tâm về an ninh hay bất cứ điều gì tôi chỉ muốn cách dễ nhất.

+2

cách dễ nhất là sử dụng gói khái niệm –

+0

Bạn sử dụng các gói để gửi các đối tượng không phải là chuỗi hay gì đó? –

+0

Không phải vì họ chỉ dạy bạn cách làm những việc cơ bản như dây ... –

Trả lời

6

hệ với chúng tôi các gói bên trong ý định không phải là về bảo mật, đó là bởi vì những kẻ Android đã làm cho nó theo cách đơn giản và đơn giản. Theo ý kiến ​​của tôi bằng cách sử dụng bó và ý định để vượt qua các đối tượng lớn hơn không phải là một ý tưởng tốt. nó trở nên quá phức tạp để thực hiện, làm cho đối tượng trở nên nguyên thủy (khi sử dụng có thể chuyển nhượng) và cũng tạo một bản sao ở phía bên kia trong bộ nhớ (bạn lấy một đối tượng, đặt mọi thứ bên trong ý định và sau đó tạo lại nó phía bên kia tạo ra một bản sao mới ra khỏi nó) mà cho các đối tượng có một dấu chân bộ nhớ lớn hơn là không tốt.

tôi sẽ đề nghị:

  1. hoặc sử dụng một cửa hàng singleton
  2. Sử dụng lớp ứng dụng (mà cũng hoạt động như một singleton)

Tôi thường sử dụng một singleton trong đó có một HashMap bên trong nơi một phím số nguyên được tạo ra bởi tôi (từ Integer nguyên tử) và một đối tượng được đặt bên trong bản đồ. Bạn chỉ cần gửi ID bên trong ý định như một phần bổ sung và lấy nó ở phía bên kia bằng cách lấy chìa khóa từ ý định và truy cập singleton của bạn để lấy và loại bỏ đối tượng (từ bản đồ đó) và sử dụng nó trong hoạt động/dịch vụ mới của bạn.

Dưới đây là một mẫu của một cái gì đó như thế này:

(Lưu ý: đây là một phần từ lib của tôi cho các yêu cầu còn lại (https://github.com/darko1002001/android-rest-client) trong trường hợp bạn muốn xem thêm chi tiết về cách mọi thứ được triển khai). trong trường hợp của bạn, bạn sẽ cần phải loại bỏ một số mã và thay thế nó bằng của riêng bạn, nhưng ý tưởng chung là như nhau.

/** 
* @author Darko.Grozdanovski 
*/ 
public class HttpRequestStore { 

    public static final String TAG = HttpRequestStore.class.getSimpleName(); 

    public static final String KEY_ID = "id"; 
    public static final String IS_SUCCESSFUL = "isSuccessful"; 

    private static final HashMap<Integer, RequestWrapper> map = new HashMap<Integer, RequestWrapper>(); 

    private final AtomicInteger counter = new AtomicInteger(); 
    private static Class<?> executorServiceClass = HTTPRequestExecutorService.class; 

    private final Context context; 
    private static HttpRequestStore instance; 

    private HttpRequestStore(final Context context) { 
     this.context = context; 
    } 

    public static HttpRequestStore getInstance(final Context context) { 
     if (instance == null) { 
      instance = new HttpRequestStore(context.getApplicationContext()); 
     } 
     return instance; 
    } 

    public static void init(final Class<?> executorServiceClass) { 
     HttpRequestStore.executorServiceClass = executorServiceClass; 
    } 

    public Integer addRequest(final RequestWrapper block) { 
     return addRequest(counter.incrementAndGet(), block); 
    } 

    public Integer addRequest(final Integer id, final RequestWrapper block) { 
     map.put(id, block); 
     return id; 
    } 

    public void removeBlock(final Integer id) { 
     map.remove(id); 
    } 

    public RequestWrapper getRequest(final Integer id) { 
     return map.remove(id); 
    } 

    public RequestWrapper getRequest(final Intent intent) { 
     final Bundle extras = intent.getExtras(); 
     if (extras == null || extras.containsKey(KEY_ID) == false) { 
      throw new RuntimeException("Intent Must be Filled with ID of the block"); 
     } 
     final int id = extras.getInt(KEY_ID); 
     return getRequest(id); 
    } 

    public Integer launchServiceIntent(final HttpRequest block) { 
     return launchServiceIntent(block, null); 
    } 

    public Integer launchServiceIntent(final HttpRequest block, RequestOptions options) { 
     if (executorServiceClass == null) { 
      throw new RuntimeException("Initialize the Executor service class in a class extending application"); 
     } 
     if (isServiceAvailable() == false) { 
      throw new RuntimeException("Declare the " + executorServiceClass.getSimpleName() + " in your manifest"); 
     } 
     final Intent service = new Intent(context, executorServiceClass); 
     final RequestWrapper wrapper = new RequestWrapper(block, options); 
     final Integer requestId = addRequest(wrapper); 
     service.putExtra(KEY_ID, requestId); 
     context.startService(service); 
     return requestId; 
    } 

    public boolean isServiceAvailable() { 
     final PackageManager packageManager = context.getPackageManager(); 
     final Intent intent = new Intent(context, executorServiceClass); 
     final List<ResolveInfo> resolveInfo = packageManager.queryIntentServices(intent, 
       PackageManager.MATCH_DEFAULT_ONLY); 
     if (resolveInfo.size() > 0) { 
      return true; 
     } 
     return false; 
    } 

} 
0

Bạn có thể sử dụng một trong hai Gói hoặc tùy chọn được chia sẻ cho biến chia sẻ hoặc lưu biến để sử dụng trong tương lai.

Ví dụ ưu đãi chia sẻ, bạn có thể tìm thấy here Ví dụ cho bó bạn có thể tìm here

0

Singleton sẽ là phương pháp tốt nhất

0

Bạn có thể sử dụng tính năng bổ sung ý định,

Intent intent = new Intent(getBaseContext(), NewActivity.class); 
intent.putExtra("DATA_KEY", data); 
startActivity(intent) 

Các docs cho Intents có nhiều thông tin hơn (xem phần có tiêu đề "Extras").

1

Bạn có thể sử dụng Gói để chia sẻ các biến trong các hoạt động khác. Nếu bạn muốn vượt qua đối tượng lớp của riêng bạn trong các hoạt động khác sử dụng Parcelable đến lớp học của bạn

Dưới đây là một ví dụ

public class Person implements Parcelable { 
    private int age; 
    private String name;  

    // Setters and Getters 
    // .... 


    public int describeContents() { 
     return 0; 
    } 

    public void writeToParcel(Parcel out, int flags) { 
     out.writeString(name); 
     out.writeInt(age); 
    } 

    public static final Parcelable.Creator<Person> CREATOR 
      = new Parcelable.Creator<Person>() { 
     public Person createFromParcel(Parcel in) { 
      return new Person(in); 
     } 

     public Person[] newArray(int size) { 
      return new Person[size]; 
     } 
    }; 

    private Person(Parcel in) { 
     name = in.readString(); 
     age = in.readInt(); 
    } 
} 

Chèn đối tượng Person của bạn trong bó

Intent i = new Intent(); 
Bundle b = new Bundle(); 
b.putParcelable("bob", new Person()); 

Bắt Person đối tượng

Intent i = getIntent(); 
Bundle b = i.getExtras(); 

Person p = (Person) b.getParcelable("bob"); 
+0

Cảm ơn sự giúp đỡ của bạn, cả hai câu trả lời đều giúp tôi nhưng tôi không thể chấp nhận cả hai. –

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