我使用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()方法无法正常工作。
答案 0 :(得分:1)
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被调用,因为应用程序没有被销毁,但没有理由重新创建应用程序。如下图所示
我强烈建议您浏览this并阅读/了解android生命周期活动事件,并了解在活动的不同状态期间调用哪些方法。