Application类的onCreate()方法与OneSignal无法正常工作

时间:2016-09-03 12:53:08

标签: android oncreate onesignal

我使用OneSignal在我的Android应用中发送推送通知。这是Application类的onCreate()方法:

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        OneSignal.startInit(this)
                .setNotificationOpenedHandler(new MyNotificationOpenedHelper())
                .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
                .init();

        Log.i("onesignaal", "app onCreate()");
    }
}

但问题在于:当我第一次运行应用程序时,onCreate()方法按预期调用。但是,当我按下主页按钮并从工作应用程序中清除我的应用程序时,onCreate()方法被召回。每当我在第一次运行后运行应用程序时,onCreate()方法在应用程序启动时不会调用,每次我完全关闭应用程序时都会调用它。 (每次我完全关闭应用程序然后运行)

当我删除OneSignal初始化时:

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();        

        Log.i("onesignaal", "app onCreate()");
    }
}

onCreate()方法按预期运行:它每次启动应用程序时调用,并且不会完全调用关闭应用程序。问题在哪里?

编辑:

我找到了原因。我有一个方法来获取OneSignal用户ID并将其保存到我的数据库中。当我在Application的onCreate()方法上调用该方法时,会出现问题。但是当我不调用该方法时,onCreate()方法就像预期的那样工作。这个功能:

private void saveOnesignalId(){

    OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
        @Override
        public void idsAvailable(final String userId, String registrationId) {

            Log.i("onesignaal", "userId : " + userId);
            Log.i("onesignaal", "registrationId : " + registrationId);

        }
    });

}

但我仍然需要解决方案。

编辑:这里是所有Application类:

public class App extends Application {

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

        SugarContext.init(this);

        OneSignal.startInit(this)
                .setNotificationOpenedHandler(new MyNotificationOpenedHelper())
                .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
                .init();

        Log.i("onesignaal", "app onCreate()");

        saveOnesignalId();

    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        SugarContext.terminate();
    }


    private void saveOnesignalId(){

        OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
            @Override
            public void idsAvailable(final String userId, String registrationId) {

                Log.i("onesignaal", "userId : " + userId);
                Log.i("onesignaal", "registrationId : " + registrationId);

            }
        });

    }


}

编辑:我认为问题出在OneSignal SDK上。当我删除所有OneSignal方法时,没有问题。 onCreate()方法正常工作。但是当我使用任何OneSignal方法时,应用程序的onCreate()方法无法正常工作。

2 个答案:

答案 0 :(得分:1)

在启动任何Activities,BroadcastReceivers或Services之前启动应用程序进程时,将调用

Application.onCreate。在方法中放置任何代码时,您需要考虑这一点,因为它并不总是与用户与您的应用程序的交互直接相关。

在您添加OneSignal后,当应用程序被刷掉时,您看到onCreate被触发的原因是它添加了一个SyncService Service类。它与您的应用程序一起处于粘滞状态,以确保发送任何待处理标记和其他会话字段。当您的应用程序被刷掉时,Android会终止您的进程,然后使用OneSignal的SyncService再次启动它。该服务将检查是否有任何挂起的更改,如果没有,将自行停止。

发送到您应用的任何Intent(如收到的GCM消息)也会导致onCreate被调用。有关Application和流程生命周期(与Activity生命周期不同)的更多详细信息,建议您阅读以下内容。

https://developer.android.com/guide/topics/processes/process-lifecycle.html https://developer.android.com/reference/android/app/Application.html#onCreate() https://developer.android.com/guide/components/processes-and-threads.html

答案 1 :(得分:0)

我推测

当我按下主页按钮并从工作应用

中清除我的应用时

你的意思是你的应用程序正在后台运行。

看到的是这是默认的android生命周期行为。如果您没有明确地杀死应用程序,即将其从后台删除,则应用程序不会被销毁。并进入暂停模式,即onPause方法被调用,当你重新打开应用程序onResume被调用,因为应用程序没有被销毁,但没有理由重新创建应用程序。如下图所示

enter image description here

我强烈建议您浏览this并阅读/了解android生命周期活动事件,并了解在活动的不同状态期间调用哪些方法。