Java 将绘图从一个活动传递到另一个活动的最佳方式是什么?

Java 将绘图从一个活动传递到另一个活动的最佳方式是什么?,java,android,Java,Android,大家一致认为,使用Intent将一个Drawable从一个活动传递到另一个活动是一个非常糟糕的主意(可能是因为它太慢了?)。一般建议传递图像的Uri,而不是图像本身,但是当图像存储在数组或列表中时,此方法不适用。例如,我有一个Drawable列表,其中包含用户拥有的所有应用程序的图标。当我需要将这些图标传递给另一个活动时,没有可用的Uri。因此,我所做的是使列表在应用程序类中可用,这意味着我有一个扩展应用程序的类,称为通知: public class Notifications extends

大家一致认为,使用Intent将一个Drawable从一个活动传递到另一个活动是一个非常糟糕的主意(可能是因为它太慢了?)。一般建议传递图像的Uri,而不是图像本身,但是当图像存储在数组或列表中时,此方法不适用。例如,我有一个Drawable列表,其中包含用户拥有的所有应用程序的图标。当我需要将这些图标传递给另一个活动时,没有可用的Uri。因此,我所做的是使列表在应用程序类中可用,这意味着我有一个扩展应用程序的类,称为通知:

public class Notifications extends Application {

    private List<ResolveInfo> packages;

    public static final String CHANNEL_ID = "exampleServiceChannel";

    @Override
    public void onCreate() { //using onCreate will help you show notifications before any activity begins
        super.onCreate();

        createNotificationChannels();

    }

    public List<ResolveInfo> getPackages() {
        return packages;
    }

    public void setPackages(List<ResolveInfo> packages) {
        this.packages = packages;
    }

    private void createNotificationChannels() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //Check if device running Oreo or higher since notification channels only work Oreo or higher
            NotificationChannel serviceChannel = new NotificationChannel(CHANNEL_ID , getString(R.string.service_channel_name) , NotificationManager.IMPORTANCE_LOW);

            serviceChannel.setDescription(getString(R.string.service_channel_description)); // Can also change anything about channel, like its color

            NotificationManager manager = getSystemService(NotificationManager.class);
            if (manager != null)
            manager.createNotificationChannel(serviceChannel);

        }
    }
因此,我可以从任何其他活动访问此列表,如:

Notifications notifications = (Notifications) getApplicationContext();
List<ResolveInfo> packages = notifications.getPackages();
final PackageManager packageManager = getPackageManager();
final Drawable icon = packages.get(position).loadIcon(packageManager);
Notifications通知=(通知)getApplicationContext();
List packages=notifications.getPackages();
最终PackageManager PackageManager=getPackageManager();
最终可绘制图标=packages.get(position).loadIcon(packageManager);

问题是,人们一致认为这也是一种糟糕的方法,即创建应用程序级列表会导致内存泄漏。这是比使用意图更好还是更糟糕的方法?还有什么其他方法呢?

不确定这是否值得作为答案,但你说:

然后我在主要活动中填写了这个包列表

所以,如果你能在一个活动中完成这个,为什么不在第二个活动中再做一次呢?这不是一个更好的解决方案,而不是在应用程序中设置东西吗



P>可选的,这听起来像典型的“我在B中还需要数据”问题,在这里你可能需要考虑使用片段和共享活动

最好的解决方案,最有可能的是摆脱第二个活动。Android应用程序开发正朝着一个单一的应用程序活动的方向大力发展,应用程序的片段或组合处理单个屏幕。“使用Intent是一种更好还是更糟糕的方法?”--更好,因为您不太可能因
TransactionTooLargeException
而崩溃。在这里,单例存储库不是一个糟糕的解决方案,尽管将其作为
应用程序的子类并不好。如果“do it”是指创建单例存储库,那么是的。如果您使用的是依赖项反转框架(Dagger/Hilt、Koin等),那么会更容易。您的singleton存储库将使用
应用程序
singleton来获取其可绘制内容,而不是
应用程序
singleton。我不知道您的第一个链接中的人是谁,大多数问题将通过使用依赖项反转框架来解决。您的第二个链接来自十多年前,已有十年历史的堆栈溢出答案将会有问题。“当然,示例是解释外来概念的最佳方式:)”——我在中使用Koin进行依赖项反转。我的书中没有涉及Dagger,尽管今年晚些时候我可能会做一个Dagger/Hilt+Java版本的
Dickekoin
,“有点让人难以承受”——如果你提到这个例子,这就是为什么会有这样的例子。“在Java中,有没有一个例子说明如何使用这种依赖项反转创建和使用单例?”--Dagger并不是特别简单。我相信有很多匕首的例子;我的指尖没有链接。总的来说,对于更大的主题,我推荐结构化的教育选项(书籍、课程)。是的,我每次都可以重新创建列表,但我只希望列表中的一个可绘图项在第二次活动中可用(该可绘图项的位置通过意向传递)。因此,每次打开另一个活动时,我都必须再次创建整个列表。然后,您可能需要使用片段,因为您可以设置活动中需要的所有数据
Notifications notifications = (Notifications) getApplicationContext();
List<ResolveInfo> packages = notifications.getPackages();
final PackageManager packageManager = getPackageManager();
final Drawable icon = packages.get(position).loadIcon(packageManager);