java 您如何轻松地与其他活动共享变量?[duplicate]

0x6upsns  于 2022-12-10  发布在  Java
关注(0)|答案(5)|浏览(118)

此问题在此处已有答案

How do I pass data between Activities in Android application?(53个答案)
4小时前关门了。
我正在制作一个纸牌游戏,我有一个活动用来弃牌,还有一个活动用来显示分数。问题是我想把一些对象(玩家和庄家的牌)传递给另一个活动,这样我就可以把分数中的imageview设置为玩家手中的牌。我该怎么做呢?我不关心安全性或任何事情,我只想用最简单的方法。

sdnqo3pr

sdnqo3pr1#

在Intent中使用bundle并不是因为安全问题,而是因为Android的开发人员将其简单明了。在我看来,使用bundle和Intent来传递更大的对象并不是一个好主意。它的实现太复杂了,会让你把对象分解为原语(使用parcelable时),并在内存的另一端制作副本(取一个对象,在Intent中设置所有内容,然后在另一侧重新创建它,从而创建一个新副本),这对于内存占用量较大的对象来说并不好。
我建议:
1.使用单一存储
1.使用应用程序类(其行为也类似于单例)
我经常使用一个singleton,它有一个hashMap,我在其中生成了一个整数键(从原子Integer中),并在Map中放置了一个对象。您只需将ID作为一个额外项发送到Intent中,然后在另一端通过从Intent中获取键来检索它,并访问您的singleton来检索和删除对象(从该Map中),并在您的新Activity/服务中使用它。
下面是一个类似这样的例子:
(Note:这是我的restrequests库(https://github.com/darko1002001/android-rest-client)的一部分,如果你想了解更多关于如何实现所有内容的细节)。在你的例子中,你需要剥离一些代码并用你自己的代码替换,但是总体思路是相同的。

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

}
ao218c7q

ao218c7q2#

您可以使用Bundle在其他Activity中共享变量。如果您想在其他Activity中传递您自己的类对象,请使用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对象插入包中

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");
goqiplq2

goqiplq23#

您可以使用捆绑包或共享首选项来共享变量或保存变量以供将来使用。
您可以找到的共享首选项示例here您可以找到的捆绑包示例here

t9eec4r0

t9eec4r04#

Singleton将是最好的方法

dy1byipe

dy1byipe5#

您可以使用意图附加项,

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

用于Intents的docs提供了更多信息(请查看标题为“Extras”的部分)。

相关问题