我一直在研究Android SDK平台,有点不清楚如何保存应用程序的状态.因此,考虑到'Hello,Android'示例的这种小型重新设计:
package com.android.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
private TextView mTextView = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = new TextView(this);
if (savedInstanceState == null) {
mTextView.setText("Welcome to HelloAndroid!");
} else {
mTextView.setText("Welcome back.");
}
setContentView(mTextView);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这对于最简单的情况就足够了,但无论我如何远离应用程序,它总是以第一条消息响应.
我确信解决方案就像覆盖onPause
或类似的那样简单,但我已经在文档中捅了大约30分钟左右,并且没有找到任何明显的东西.
我有一些不清楚的情况:
在最后一次参考持有活动被破坏后,静态单例是否会被垃圾收集?因为Application中没有对单例实例的引用.那么我可以依靠单身人士吗?
通过官方Android文档:
通常不需要子类Application.在大多数情况下,静态单例可以以更模块化的方式提供相同的功能.
通过一些帖子:
在开发应用程序时,我发现有时一些绑定到活动的静态变量恰好是未初始化的,即使它们之前已被初始化!我认为当一个静态变量被初始化时,它在应用程序的整个生命周期中都是如此,但事实并非如此.
换句话说,如果没有任何东西对我的静态单例类进行引用,那么是什么阻止它被垃圾收集和销毁?
我最近在android上做了一个应用程序,在某些方面我怀疑哪个是共享数据的有效方式.就像我可以在一个类中声明静态变量和使用Classname.Variablename调用来自其他类变量或者我可以通过这些数据与我的意图,并从其他类得到的意图数据或者我可以使用共享偏好,并从数据它甚至可以将数据存储在数据库中,并从数据库中的其他类中检索它.我怀疑哪个是最有效的方法(获取数据)?由于android应用程序最终是为手机设计的,因此内存使用和效率应该是约束.任何人都可以指导我走正确的道路,这将非常有帮助.
我有一个android java类,其中一个静态实例保存用户的信息.但是,在一些用户使用我的应用程序的极少数情况下,该静态实例中的一个变量在一段时间后变为null.这个java类是全局的(不附加到任何活动).可能是什么导致了这个?
编辑:除了在应用程序启动期间,变量永远不会更改.我已经检查过调用它的函数永远不会被调用多次(adb logcat证明当我添加一个日志表明它正被调用时).
代码是这样的:
class UserCore
{
class UserData
{
int ID;
string Name;
}
public UserData User;
public static UserCore Instance = new UserCore();
public void Login()
{
Log.d("User", "Logging in");
new Throwable().printStackTrace();
User = null;
//Fetch user data
User = new UserData();
User.ID = ...
User.Name = ...
}
....
}
Run Code Online (Sandbox Code Playgroud) 我有一个多活动应用程序,并将数据保存在许多其他活动使用的主菜单活动中。
我在主要活动中的变量之一可能是这个
static double targetAngle = 45;
Run Code Online (Sandbox Code Playgroud)
我可能会从这样的另一个活动中调用该变量
diff = Main.targetAngle - angle;
Run Code Online (Sandbox Code Playgroud)
或者我可以这样设置
Main.targetAngle = angle;
Run Code Online (Sandbox Code Playgroud)
从这个参考,http://developer.android.com/guide/faq/framework.html这似乎是传递数据的正确方法。但是总是有关于活动在任何时候被操作系统杀死的话题。
我的问题是,这是否安全?
作为替代方案,我在 SO 成员的建议下有一个名为 Helper 的类,它具有一些在每个活动中使用的函数,这些函数也有一些静态数据。例如,Helper 类具有此数据,后跟我的函数
public class Helper {
static double[] filter1 = new double[]{0,0,0,0,0};
static double[] filter2 = new double[]{0,0,0,0,0};
static double cog = 0;
...
various functions....
}
Run Code Online (Sandbox Code Playgroud)
如果这样会更好,我可以将我的共享变量保存在该帮助程序类中。该类每秒调用一次,如果它被杀死,我就死了,真的需要重新考虑一下。我应该提到我对我所做的事情没有任何问题,但是我的一个用户的 Nexus-7 崩溃了,我们不知道为什么,所以我认为他运行的应用程序可能比我多,因此我的问题.
我还应该提到,如果用户退出应用程序,我已经保存了所有需要保存在 SD 卡上的文件中的变量,以便它们可以重新加载。换句话说,当应用程序被杀死时数据丢失不是问题。我的问题是仅当应用程序还活着时我的主要活动是否被终止。
如果我们有一个这样的对象
object Repo { var activeMovies: ArrayList<Movie>? = null }
Run Code Online (Sandbox Code Playgroud)
然后我们这样称呼它来分配一个值
Repo.activeMovies = movieList
Run Code Online (Sandbox Code Playgroud)
实例化它的活动完成后,是否会收集垃圾?
我知道这可能是一个非常基本的问题,但是如果使用Kotlin中的object
类型,我将无法理解其生命周期。