我已将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;
}
}
我正在访问“活动”和“服务”中的myObject
值MyApplication.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中遇到了这种不常见的行为。
答案 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}}