【问题标题】:When does Application's onCreate() method get called?什么时候调用 Application 的 onCreate() 方法?
【发布时间】:2011-12-02 22:37:46
【问题描述】:

在我的 Android 应用程序中,我有一个扩展 android.app.ApplicationDefaultApplication 类,在它的 onCreate() 中我绑定了一些服务,这些服务将被我在这个应用程序中的其他活动使用。

我还有一个BroadcastReceiver,它监听和接收 C2DM 消息。当此接收器在应用程序未运行时收到消息时,它将触发一个对话框,显示即将到来的消息,并将启动我的应用程序的 Activity。

我的问题是,当我在没有与DefaultApplication 进行任何交互的情况下启动一个活动时,我的DefaultApplicationonCreate() 会因为该应用程序的一个活动已经启动而被调用吗?

这里是我的DefaultApplication的定义和Manifest:

public class DefaultApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        doBindService();

    }

    void doBindService() {

        // Establish a connection with the service. We use an explicit
        // class name because we want a specific service implementation that
        // we know will be running in our own process (and thus won't be
        // supporting component replacement by other applications).

        bindService(new Intent(DefaultApplication.this, SocketService.class),
                socketServiceConnection, Context.BIND_AUTO_CREATE);

        mIsBound = true;
    }

    void doUnbindService() {
        if (mIsBound) {
            // Detach our existing connection.
            unbindService(socketServiceConnection);
            mIsBound = false;
        }
    }
}

清单如下所示:

<application android:icon="@drawable/icon" android:label="@string/app_name"
        android:name="com.mypackage.DefaultApplication"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:debuggable="true">
<service android:name="com.mypackage.services.SocketService"></service>
<activity android:name="TestActivity"
            android:screenOrientation="landscape"></activity>
</application>

【问题讨论】:

  • 是的,这行得通,我还没有看到其他...
  • 我不明白你为什么要扩展Application?你不应该扩展Activity吗?
  • @LAS_VEGAS 在我的 DefaultApplication 的其余部分中,我存储了一些数据并定义了一些在应用程序范围内使用的方法。我只复制了一部分到这里。

标签: android-activity oncreate application-lifecycle android


【解决方案1】:

只有第一次。

当 Activity 启动且应用程序未加载时,onCreate() 两个方法都会被调用。

但对于后续的Activity启动,应用程序的onCreate()将不会被调用。

【解决方案2】:

onCreate被称为here时,您可以找到官方答案。

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

【讨论】:

    【解决方案3】:

    请注意,如果任何服务被定义为在其他进程中运行,例如使用android:process= 然后应用程序的onCreate() 将再次为该进程调用。

    例如见Android Application class method onCreate being called multiple times

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 2015-07-13
      • 2012-11-30
      • 2012-05-16
      相关资源
      最近更新 更多