应用程序子类在关闭后重新创建

时间:2015-03-12 12:54:21

标签: android android-lifecycle

我的申请有一个奇怪的问题,我不确定是什么导致它。

问题

我将应用程序中的重要调用记录到文件中,因此当用户向我们提交错误报告时,我可以确切地看到他们已经完成了什么以及何时完成。

这个以及显示为视觉确认的通知,让我相信由于某种原因,我关闭应用程序后正在重新创建扩展Application的类。

所以在onCreate中我将生命周期方法记录到文件中。请记住,当Service onDestroy被调用时,这是我最后一次关闭应用程序,然后在收费过夜之前完成,最后Application: onCreate null是我第一次在早上再次打开它。

2015-03-11T19:43:47.979Z (24) INFO Service onDestroy
2015-03-11T21:47:34.433Z (24) INFO Application: onCreate null
2015-03-12T02:21:27.236Z (24) INFO Application: onCreate null
2015-03-12T03:10:45.767Z (24) INFO Application: onCreate null
2015-03-12T04:45:08.419Z (24) INFO Application: onCreate null
2015-03-12T06:39:09.433Z (24) INFO Application: onCreate null

正如您所看到的,出于某种原因,当应用程序进入后台时,会以随机间隔调用onCreate。

我的服务设置

我在应用程序启动时启动服务,并在其onCreate中调用startForeground()。我在其中START_STICKY返回onStartCommand

当我完成该服务后,我会从服务外部和服务stopService中拨打onDestroy,并将stopForeground与ID一起呼叫。

我知道它正在被销毁,因为我在它被破坏时记录并且当它被创建时你可以从上面看到它在应用程序时没有被重新创建。

MY MANIFEST

发布整件事太大了,所以我复制了一些值得关注的区域。我停止的区域是没有其他意图过滤器的活动。以下磨损服务是新的,问题发生在这个添加之前,所以我不相信这是导致它。

<!-- Cannot set android:exported to false otherwise this service does not work.-->
        <service android:name=".appwear.WearableListenerService">
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
            </intent-filter>
        </service>

当按下前台服务启动的通知操作时,将调用以下接收器。

        <receiver android:name=".recording.NotificationReceiver" android:exported="false">
            <intent-filter>
                <action android:name="com.notif.pauserecording"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.notif.startrecording"/>
            </intent-filter>
        </receiver>

<provider
            android:name="com.facebook.NativeAppCallContentProvider"
            android:authorities="com.facebook.app.NativeAppCallContentProvider#"
            android:exported="true" />

我的前台服务。

<service android:name=".recording.LocationTrackingService" />

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.logprovider"
            android:exported="false"
            android:grantUriPermissions="true" >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

我的想法

可能是在我的应用程序的某个地方我忘记取消注册广播接收器或删除听众? A做了一次彻底的检查,但我有可能错过了一些东西。

我不了解生命周期吗? Application是否意味着这样做?根据文档,Application的{​​{1}}方法是......

  

在应用程序启动时,在任何活动,服务之前调用   或创建了接收者对象(不包括内容提供者)。   实现应该尽可能快(例如使用懒惰   初始化状态)因为在这个函数中花费的时间   直接影响开始第一项活动的表现,   服务或流程中的接收者。如果重写此方法,请执行   一定要打电话给super.onCreate()

1 个答案:

答案 0 :(得分:0)

考虑到您提供的信息/代码数量,任何答案都将是&#34;最佳猜测&#34;。

所以我的最佳猜测是:

  • 您以start_sticky
  • 启动此服务
  • 您的所有活动都会进入后台或被销毁,唯一正在运行的是您的服务。
  • 您从未在服务上调用stopSelf();
  • 操作系统需要做一些事情,如更新应用程序,同步数据等。
  • 操作系统会完全杀死你的应用程序。
  • 操作系统重新创建您的应用程序并重新启动该服务。

这些是你看到的日志!

不幸的是,系统可以执行这些操作,但并不总是通知您,请查看Service.START_STICKY上的文档:

  

从onStartCommand(Intent,int,int)返回的常量:如果是这样   服务的进程在启动时被终止(从...返回后)   onStartCommand(Intent,int,int)),然后将其保持在启动状态   但是不要保留这个意图。稍后系统会尝试   重新创建服务。因为它处于启动状态,它会   保证在创建后调用onStartCommand(Intent,int,int)   新服务实例;如果没有任何挂起的启动命令   如果被传递给服务,它将被调用null意图   对象,所以你必须注意检查这个。

修改

根据您发布的额外清单信息,我会指出:

  

WearableListenerService:从其他节点接收事件,例如   数据更改,消息或连接事件。

但唯一可以确定的方法是将一些Log放在那里,或者将其删除。无论哪种方式,它都需要测试。