在应用程序仍在运行时是否可以重新创建Application对象?

时间:2015-03-27 13:40:10

标签: android android-lifecycle

我已将Application对象扩展为MyApplication,设计如下

public class MyApplication extends Application {
  
  private MyObject myObject;
  
  public MyApplication () {
    mInstance = this;
  }
  
  public static MyApplication getInstance() {
    return mInstance;
  }
  
  public MyObject getMyObject(){
    return myObject;
  }
  
  public setMyObject(MyObject object){
    myObject = object;
  }
}

我正在访问“活动”和“服务”中的myObjectMyApplication.getInstance().getMyObject()。我通常没有看到任何问题,但在少数用户的生产中,有时会突然getMyObject()返回null,即重置。首先,我认为操作系统可能会杀死并重新创建应用程序,因为我正在观察null。我没有避免内存不足的情况,但是如果是这种情况,它应该在销毁Application对象之前杀死活动和服务。

Activity内,我将MyApplication的引用保留为

private MyApplication myApp = MyApplication.getInstance();

这就是我从日志中观察getMyObject()值的方法。

myApp.getMyObject()打印!= null

然后调用服务MyService并在其中调用 MyApplication.getInstance().getMyObject()打印== null

再次返回活动myApp.getMyObject()MyApplication.getInstance().getMyObject()打印!= null

在打印这些日志之前已初始化

myObject,并且在这些日志之间没有调用myObject重置代码。

是否可以重新创建Application对象但Acitivty仍处于活动状态? 要么 服务是否可以获得与Application主题不同的Activity实例?

根据我在应用程序中的理解,生命周期myApp应始终等于MyApplication.getInstance(),因为操作系统应维护单个应用程序实例。

注意:还想补充说我在三星Tab 4中遇到了这种不常见的行为。

2 个答案:

答案 0 :(得分:0)

您不想拥有公共构造函数,而是使用onCreate()方法。 您还需要该类的静态实例。

public class MyApplication extends Application {

  private MyObject myObject;
  private static MyApplication mInstance;

  @Override
  public void onCreate() {
    super.onCreate();
    mInstance = this;
  }

  public static MyApplication getInstance() {
    return mInstance;
  }

  public MyObject getMyObject(){
    return myObject;
  }

  public setMyObject(MyObject object){
    myObject = object;
  }
}

当然改变你的清单告诉你这是你的类来处理应用程序(如果还没有完成)

<application
        android:name="com.XXX.MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

答案 1 :(得分:0)

不要将数据存储在应用程序对象

应用程序对象将永久保留在内存中。当用户通过例如将您的应用程序发送到后台时如果系统需要内存,则按下主页按钮可能会杀死应用程序对象。这可能在几分钟后发生,但可能需要数小时。当用户恢复应用程序时,应用程序对象可能与以前不同,如果mMyObject没有初始值,则null将为null

解决方案

进行public MyApplication () { mInstance = this; mMyObject = new MyObject() } 检查并采取相应行动

使用某种形式的data-storage

在应用程序构造函数

中初始化对象
{{1}}