Java 当主屏幕小部件运行时,数据对象的静态数组列表是否会导致内存泄漏

Java 当主屏幕小部件运行时,数据对象的静态数组列表是否会导致内存泄漏,java,android,arraylist,static,android-widget,Java,Android,Arraylist,Static,Android Widget,在下面的代码中,我有一个包含一组变量的类。我创建了该类的几个实例,并将它们保存到arraylist中。arraylist是同一类的一部分,但标记为静态。 同一个应用程序有一个主屏幕应用程序小部件。 我担心静态arraylist将永远留在内存中,直到用户删除应用程序小部件。这是真的吗? 静态arraylist是一个好主意还是一个替代方案 public class Data { public static ArrayList<Data> listData = new ArrayL

在下面的代码中,我有一个包含一组变量的类。我创建了该类的几个实例,并将它们保存到arraylist中。arraylist是同一类的一部分,但标记为静态。 同一个应用程序有一个主屏幕应用程序小部件。 我担心静态arraylist将永远留在内存中,直到用户删除应用程序小部件。这是真的吗? 静态arraylist是一个好主意还是一个替代方案

public class Data {
    public static ArrayList<Data> listData = new ArrayList<Data>();
    String string;
    int integer;
    Data(String string, int integer){
        this.string = string;
        this.integer = integer;
    }
}

public class DataChanger {
    DataChanger(){
        Data.listData.add(new Data("string", 1));
    }
}
公共类数据{
公共静态ArrayList listData=new ArrayList();
字符串字符串;
整数;
数据(字符串、整数){
this.string=string;
this.integer=整数;
}
}
公共类数据转换器{
数据转换器(){
Data.listData.add(新数据(“字符串”,1));
}
}
静态arraylist将永远留在内存中,直到用户删除应用程序小部件

这不太可能发生,因为AppWidgetProvider是Android小部件的一个方便的
BroadcastReceiver
类。如果应用程序的其他部分没有运行,则进程可能会在调用
onUpdate()
之间终止

BroadcastReceiver
的官方文件非常清楚地表明

BroadcastReceiver
对象仅在调用
onReceive(上下文、意图)
期间有效。一旦代码从此函数返回,系统将认为对象已完成且不再处于活动状态

这对您在
onReceive(Context,Intent)
实现中可以执行的操作有重要影响:任何需要异步操作的操作都不可用,因为您需要从函数返回来处理异步操作,但此时,
BroadcastReceiver
不再处于活动状态,因此系统可以在异步操作完成之前终止其进程

特别是,您可能无法在
广播接收器
中显示对话框或绑定到服务。对于前者,您应该改用
NotificationManager
API。对于后者,可以使用
Context.startService()
向服务发送命令

参考文献-