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
我在 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