什么是Android应用程序的main()函数的最佳等价物?

时间:2013-01-20 10:57:26

标签: java android process main lifecycle

我在各处搜索了一个方法,在Android应用程序中具有相当于main()函数(yes函数而非方法)但是失败了......

通常我想做的是:

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不是标记为启动器的活动。

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

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

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

所有应用程序的“DataBase”都在单独的Singleton中定义,如下所示:

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()的第一次调用中加载我的DataBase是不必要的并且是过度的。我所做的是有一个静态布尔值,指示数据库是否已在此进程的生命周期中加载。 因此,AppWidgetProvider可以实现大量的时间,只要Singleton DataBase持续存在(所以进程),它每次都不会重新加载DataBase,得到它? (是很难清楚......)

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

任何评论或不那么棘手的东西,我现在所做的是受欢迎的。 感谢。

3 个答案:

答案 0 :(得分:6)

onResume()是在启动app之前总是会达到的函数,所以你可以将'main'代码放在onCreate()方法或onResume()中。

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

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

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

答案 1 :(得分:3)

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

  

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

终止难以处理。您可能必须单独监视应用程序的每个组件。如果您要定位API级别14或更高版本,则可以使用Application.registerActivityLifecycleCallbacks来帮助解决此问题。

答案 2 :(得分:0)

  

到目前为止,我见过的最接近的方法是使用SplashScreen和   覆盖OnCreate()方法。问题是这是不可接受的   在我看来,我的观点是。为什么?因为SplashScreen不是一个   活动被标记为启动器。

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

  

这使它出现在应用程序列表中,我不想要的东西   开发一个app小部件。此外,在我之前放置代码的位置   应用程序破坏?在onDestroy()方法中?不,再一次,这是   不可靠的。 Android可以决定删除我的实例而不是   应用程序仍在运行。

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

  

要回到那个AppWidgetProvider,我必须欺骗一点。确实,   Android可以决定删除其实例,而其他一些   活动仍在进行,流程仍在运行。因此对于   例如,在第一次调用时系统地加载我的DataBase   OnUpdate()是不必要的并且是矫枉过正的。我所做的就是静电   boolean值,指示是否已为数据库加载   这个过程的生命周期与否。因此,AppWidgetProvider可以   只要Singleton DataBase持续存在,就可以实现大量的时间   (所以这个过程),每次都不会重新加载DataBase,搞定了吗?   (是很难清楚......)

我认为你发布的单例数据库连接的例子并不差,但是有更好的方法可以干净利落地完成工作。例如hibernate framework connection pooling