首页 > 解决方案 > 将 Drawable 从一个活动传递到另一个活动的最佳方法是什么?

问题描述

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

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

        }
    }

然后我packages在主要活动中填写了这个列表,如下所示:

final PackageManager pm = getPackageManager();
Intent main = new Intent(Intent.ACTION_MAIN, null);
main.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> packages = pm.queryIntentActivities(main, 0); //get a list of installed apps.
Notifications notifications = (Notifications) getApplicationContext();
notifications.setPackages(packages);

因此,我可以从任何其他活动中访问此列表,如下所示:

Notifications notifications = (Notifications) getApplicationContext();
List<ResolveInfo> packages = notifications.getPackages();
final PackageManager packageManager = getPackageManager();
final Drawable icon = packages.get(position).loadIcon(packageManager);

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

标签: javaandroid

解决方案


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

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

因此,如果您能够在一项活动中填写此内容,为什么不在第二项中再次填写呢?这不是一个更好的解决方案,而不是在 Application 中设置东西吗?


或者,这听起来像是典型的“我在 A 中有数据,我在 B 中也需要”问题,您可能必须考虑使用片段和共享活动


推荐阅读