关于java:如何轻松地与其他活动共享变量?

How do you share variables with other activities easily?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How do I pass data between activities in Android?

我正在制作一个纸牌游戏,我有一个用于丢弃卡片的活动和一个用于显示分数的活动。 问题是我想将一些对象(玩家和经销商的手)传递给另一个活动,这样我就可以将得分中的imageViews设置为玩家手中的牌。 我怎样才能做到这一点? 我不关心安全性或任何我想要最简单的方法。


在意图中使用捆绑包不是关于安全性,而是因为Android人员这样简单明了。在我看来,使用bundle和Intent来传递更大的对象并不是一个好主意。它实现起来太复杂了,让你把对象缩小到原语(当使用parcelable时),并在内存的另一边复制(你拿一个对象,在intent中设置所有内容然后重新创建它另一方制作了一个新的副本)对于内存占用较大的对象而言并不好。

我会建议:

  • 要么使用单身商店
  • 使用应用程序类(也像单例一样)
  • 我经常使用一个单例,里面有一个hashMap,其中一个整数键由我(来自原子整数)和一个放在地图内的对象生成。您只需将意图内的ID作为额外内容发送,并通过获取意图中的密钥并访问您的单例来检索和删除对象(从该地图)并在新的活动/服务中使用它,从另一方面检索它。

    以下是这样的示例:

    (注意:这是我的lib中的一部分用于休息请求(https://github.com/darko1002001/android-rest-client),以防您想要查看有关如何实现所有内容的更多详细信息)。在你的情况下,你需要剥离一些代码并用你自己的代码替换它,但总的想法是一样的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    /**
     * @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在其他活动中共享变量。如果要在其他活动中传递自己的类对象,请使用Parcelable到您的类

    这是一个例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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对象

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

    获取Person对象

    1
    2
    3
    4
    Intent i = getIntent();
    Bundle b = i.getExtras();

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


    你可以使用intent extras,

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

    Intent的文档有更多信息(请参阅标题为"Extras"的部分)。


    单身人士将是最好的方法


    您可以使用Bundles或共享首选项中的任何一个共享变量或保存变量以供将来使用。

    您可以在此处找到共享首选项的示例
    您可以在此处找到捆绑包的示例