何时调用Application的onCreate()方法?

Yas*_*RIM 55 android application-lifecycle oncreate android-activity

在我的Android应用程序中,我有一个DefaultApplication扩展的类android.app.Application,并在其中onCreate()绑定了一些服务,这些服务将由我在此应用程序中的其他活动使用.

我也有一个BroadcastReceiver侦听和接收C2DM消息.当此接收器在应用程序未运行时收到消息时,它将触发一个对话框,显示即将发送的消息,它将启动我的应用程序的活动.

我的问题是,当我开始一个没有任何交互的活动时DefaultApplication,我DefaultApplicationonCreate()被调用是因为该应用程序的活动已经开始了吗?

以下是我的定义和清单DefaultApplication:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

清单看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

Pet*_*ego 44

只是第一次.

当Activity启动并且未加载应用程序时,onCreate()将调用这两个方法.

但是对于随后的Activity启动,onCreate()将不会调用应用程序.

  • 不完全正确.[保罗的答案解释了一些,包括一个有用的链接.](http://stackoverflow.com/a/28498115/383414) (2认同)

Ash*_*ali 33

你可以找到一个正式答复时,onCreate被称为这里.

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


Pau*_*est 14

请注意,如果任何服务被定义为在其他进程中运行,例如,android:process=那么onCreate()将再次为该进程调用Application .

例如,请参阅Android应用程序类方法onCreate被多次调用