java - 将 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 更好还是更差的方法?还有什么其他方法?
解决方案
不确定这是否值得作为答案,但你说:
然后我在主要活动中填写了这个包列表
因此,如果您能够在一项活动中填写此内容,为什么不在第二项中再次填写呢?这不是一个更好的解决方案,而不是在 Application 中设置东西吗?
或者,这听起来像是典型的“我在 A 中有数据,我在 B 中也需要”问题,您可能必须考虑使用片段和共享活动
推荐阅读
- shell - 处理程序:xyz.lambda_handler 是一个文本,我希望 xyz.lambda_handler 作为使用 sh 脚本的输出
- sql-server - 将多个表中的多行用于具有标量 UDF 的持久计算列
- jmeter - 如何使用数组的长度来设置线程组中的线程数
- algorithm - 围绕对角线对矩阵元素进行排序
- python - 如何检查具有不同像素化的两张图像的相似性
- ubuntu-16.04 - 为 Mysql 5.6 & Ubuntu16.4 设置 binlog
- html - margin-bottom 和 vh 单位的问题
- javascript - 如何更新数组中的对象
- css - 如何在不丢失边框底部的情况下调整大小
- c - 在 main 中使用头文件中的结构(在 C 中)