Application class 的 onCreate() 方法未按预期与 OneSignal 一起工作

onCreate() method of Application class not working as expected with OneSignal

我在 Android 应用程序中使用 OneSignal 发送推送通知。这是我的应用程序 class 的 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() 方法 运行s as aspected :它在每次应用程序启动时调用并且不会调用完全关闭应用程序。问题出在哪里?

编辑:

找到原因了。我有一种获取 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);

        }
    });

}

但我仍然需要解决方案。

编辑: 这里所有的应用程序 class:

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() 方法无法正常工作。

我推测

当我按下主页按钮并将我的应用程序从工作应用程序中清除时

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

请注意这是默认的 android 生命周期行为。当您没有明确终止该应用程序时,即将其从后台删除时,该应用程序不会被破坏。并进入暂停模式,即调用 onPause 方法,当您重新打开应用程序时调用 onResume,因为应用程序未被销毁,但没有理由重新创建应用程序。如下图所示

我强烈建议您仔细阅读 this 和 read/learn 关于 android 生命周期 activity 事件的内容,看看在 [=29] 的不同状态下调用了哪些方法=].

Application.onCreate 当您的应用进程在任何 Activity、BroadcastReceivers 或服务启动之前启动时调用。在方法中放置任何代码时,您需要考虑这一点,因为它并不总是与用户与您的应用程序交互直接相关。

您看到 onCreate 在您添加 OneSignal 后滑动应用时被触发的原因是它添加了 SyncService Service class。它在您的应用程序中以粘性状态启动,以确保发送任何待定标签和其他会话字段。当您的应用程序被滑动时 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