2

我到处搜索了一种在 Android 应用程序中拥有相当于 main() 函数(是函数不是方法)的方式,但失败了......

通常我想做的是:

void main()
{
    // do some really nice initialisations stuff here

    // ... let the app does his life, I really don't care

    // do some final stuff here before leaving
}

到目前为止,我看到的最接近的方法是使用 SplashScreen 并覆盖 OnCreate() 方法。问题是从我的角度来看这是不可接受的。为什么?因为 SplashScreen 只不过是一个标记为 LAUNCHER 的 Activity。

这使它出现在应用程序列表中,这是我在开发应用程序小部件时不想要的。此外,在应用程序销毁之前将我的代码放在哪里?在 onDestroy() 方法中?不,再一次,这不可靠。Android 可以决定在应用程序仍在运行时删除我的实例。

好吧,事实上,我的原则是我的应用程序的每个组件都在同一个进程中运行,因为我没有在 Manifest 中明确提到我不希望一个组件在自己的进程中运行。

对于应用程序小部件,我将初始化代码放在第一次调用 onUpdate() 方法上。我认为这是一个不错的选择。然后这个应用小部件(更准确地说是 AppWidgetProvider)负责按照自己的意愿启动任何活动。

所有应用程序的“数据库”都在一个单独的单例中定义,如下所示:

public class MyDataBase {

    public static MyDataBase getInstance() {
        if (instance_ == null)
            instance_ = new DataBase();
        return instance_;
    }

    public void load();
    public void save();

    static MyDataBase instance_ = null;

    public int myInt;
    public String myString;
    public Object myObject;
    etc..
}

至少有了这个 Singleton,我敢肯定,它的生命周期与整个应用程序本身相同。

为了支持那个 AppWidgetProvider,我不得不花点心思。实际上,Android 可以决定删除它的实例,而其他一些活动仍然存在并且进程仍在运行。因此,例如,在 OnUpdate() 的第一次调用中系统地加载我的数据库是不必要的并且是多余的。我所做的是有一个静态布尔值,该值指示数据库是否已在此过程的生命周期内加载。因此,AppWidgetProvider 可以实例化大量时间,只要 Singleton DataBase 持续存在(如此过程),它就不会每次都重新加载 DataBase,明白吗?(是的,很难说清楚……)

关于应用程序的清理代码,我想覆盖我的 DataBase Singleton 的 finalize() 方法,但是,我真的不确定这是一个好主意,因为调用此方法的那一刻是完全不可预测的。我想如果你突然关闭你的Android,它会被调用,但是我不确定这里有什么,到目前为止,我还没有找到那个部分的解决方案。

欢迎任何评论或我目前所做的不那么棘手的事情。谢谢。

4

3 回答 3

6

onResume() 是在启动您的应用程序之前总是会到达的函数,因此您可以将“主”代码放在 onCreate() 方法或 onResume() 中。

onPause() 总是在用户或操作系统销毁应用程序之前调用。

Android 文档中对生命周期有很好的解释:

http://developer.android.com/training/basics/activity-lifecycle/starting.html

于 2013-01-20T11:03:47.010 回答
3

对于初始化,您可以覆盖类的onCreate方法Application

在应用程序启动时调用,在创建任何活动、服务或接收器对象(不包括内容提供者)之前调用。实现应该尽可能快(例如使用状态的延迟初始化),因为在此函数中花费的时间直接影响启动进程中的第一个活动、服务或接收器的性能。如果您覆盖此方法,请务必调用 super.onCreate()

终止更难处理。您可能必须分别监控应用程序的每个组件。如果您的目标是 API 级别 14 或更高版本,您可以使用它Application.registerActivityLifecycleCallbacks来帮助解决此问题。

于 2013-01-20T14:46:54.527 回答
0

到目前为止,我看到的最接近的方法是使用 SplashScreen 并覆盖 OnCreate() 方法。问题是从我的角度来看这是不可接受的。为什么?因为 SplashScreen 只不过是一个标记为 LAUNCHER 的 Activity。

这是因为 Android 由多个活动组成,并且这些活动具有生命周期。所以每个活动都从 onCreate() 开始,然后在 onDestroy() 结束。 http://developer.android.com/training/basics/activity-lifecycle/starting.html

这使它出现在应用程序列表中,这是我在开发应用程序小部件时不想要的。此外,在应用程序销毁之前将我的代码放在哪里?在 onDestroy() 方法中?不,再一次,这不可靠。Android 可以决定在应用程序仍在运行时删除我的实例。

在用户按下主页按钮退出您的应用程序的场景中,您当前的活动更有可能调用 onPause() 方法(仅当活动没有其他进程要完成时)。但是,当用户强制通过结束进程关闭(终止)您的整个应用程序时。然后您不必担心调用任何方法或其他任何事情,因为 Android 本身会自动关闭与您的应用程序相关的任何内容。

为了支持那个 AppWidgetProvider,我不得不花点心思。实际上,Android 可以决定删除它的实例,而其他一些活动仍然存在并且进程仍在运行。因此,例如,在 OnUpdate() 的第一次调用中系统地加载我的数据库是不必要的并且是多余的。我所做的是有一个静态布尔值,该值指示数据库是否已在此过程的生命周期内加载。因此,AppWidgetProvider 可以实例化大量时间,只要 Singleton DataBase 持续存在(如此过程),它就不会每次都重新加载 DataBase,明白吗?(是的,很难说清楚……)

我认为您为单例数据库连接发布的示例还不错,但是有更好的方法可以干净、更有效地完成工作。例如休眠框架连接池

于 2013-01-20T11:19:10.243 回答