你如何轻松地与其他活动分享变数?

可能重复:
如何在Android中的活动之间传递数据?

我正在做一个纸牌游戏,我有一个放弃卡和活动显示分数的活动。 问题是我想通过一些对象(玩家和经销商的手)到另一个活动,以便我可以将imageViews设置在玩家手中的牌中。 我怎样才能做到这一点? 我不关心安全或任何我只想要最简单的方法。

Related of "你如何轻松地与其他活动分享变数?"

在intent里面使用bundle并不是关于安全性的,这是因为Android的人使得它简单明了。 在我看来,使用bundle和意图来传递更大的对象不是一个好主意。 它实现得太复杂了,使得你得到对象的原语(当使用parcelable),并且在内存的另一端创build一个副本(你需要一个对象,把所有的东西放在intent中,然后重新创build它另一边是新的副本),对于内存占用量较大的对象来说是不好的。

我会build议:

  1. 要么使用单身商店
  2. 使用应用程序类(它也像一个单身人士)

我经常使用一个singleton,它有一个hashMap,里面有一个整型关键字(由primefacesInteger生成)和一个放置在map中的对象。 您只需将意图中的ID作为附加信息发送,然后通过从意向获取密钥并访问您的单例来检索并从中删除对象(在该地图中)并在新的活动/服务中使用该对象,从而在另一侧检索该对象。

这是一个这样的例子:

(注意:这是从我的lib的一部分rest请求(https://github.com/darko1002001/android-rest-client),如果你想看到更多的细节如何实现的一切)。 在你的情况下,你将需要去掉一些代码并用自己的代码replace,但总的想法是一样的。

/** * @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; } } 

您可以使用Bundle在其他活动中共享variables。 如果您想在其他活动中传递您自己的类对象,请将Parcelable用于您的课程

这是一个例子

 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(); } } 

将你的Person对象插入到bundle中

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

获取Person对象

 Intent i = getIntent(); Bundle b = i.getExtras(); Person p = (Person) b.getParcelable("bob"); 

您可以使用Bundle或共享首选项中的任一个来共享variables或保存variables以供将来使用。

您可以在这里find的共享首选项的示例在这里可以find捆绑软件的示例

辛格尔顿将是最好的方法

你可以使用意图额外的,

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

Intents的文档有更多的信息(请看“Extras”部分)。