Android 关闭后正在重新创建的应用程序子类
我的申请有一个奇怪的问题,我不确定是什么原因造成的Android 关闭后正在重新创建的应用程序子类,android,android-lifecycle,Android,Android Lifecycle,我的申请有一个奇怪的问题,我不确定是什么原因造成的 <!-- Cannot set android:exported to false otherwise this service does not work.--> <service android:name=".appwear.WearableListenerService"> <intent-filter> <action an
<!-- 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>
问题
我将应用程序中的重要调用记录到一个文件中,这样当用户向我们提交错误报告时,我就可以确切地看到他们做了什么以及什么时候做了什么
这一点,加上显示为视觉确认的通知,让我相信,出于某种原因,我的类扩展了应用程序
,在我关闭应用程序后正在重新创建
因此,在onCreate
中,我将该生命周期方法记录到文件中。请记住,当调用Service onDestroy
时,这是我最后一次在充电前关闭应用程序,最后一次应用程序: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()。我在它的onStartCommand
中返回START\u STICKY
当我完成服务时,我从服务外部调用stopService
,并在服务的ondestory
中调用stopsforeground
以及id
我知道它正在被销毁,因为我在日志中记录了它被销毁和创建的时间,您可以从上面看到,当应用程序运行时,它没有被重新创建
我的清单
它太大了,无法发布整个内容,所以我复制了关注的区域。我留下的区域是没有其他意图过滤器的活动。以下磨损服务是新的,问题发生在本次添加之前,因此我不认为这是原因
<!-- 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>
按下前台服务启动的通知操作时,将调用Following receiver
<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我做了一次彻底的检查,但有可能我遗漏了什么
生命周期有什么我不理解的吗?应用程序是否打算这样做?根据文档,应用程序的onCreate
方法是
在应用程序启动时,在任何活动、服务之前调用,
或接收器对象(不包括内容提供商)已创建。
实现应该尽可能快(例如使用lazy
状态初始化)自此函数中花费的时间
直接影响开始第一项活动的绩效,
过程中的服务或接收者。如果重写此方法,请执行以下操作:
确定要调用super.onCreate()吗
考虑到您提供的信息/代码的数量,任何答案都将是“最佳猜测”
因此,我最好的猜测是:
- 您正在以
start\u sticky
- 您的所有活动都会转到后台或被销毁,唯一正在运行的就是您的服务
- 您从未调用过
stopSelf()服务上的代码>
- 操作系统需要做一些事情,比如更新应用程序、同步数据等
- 操作系统完全杀死你的应用程序来完成它的工作
- 操作系统将重新创建应用程序并重新启动服务
这些就是你看到的日志
不幸的是,系统可以完成这些工作,但并不总是能全部告知您,请查看以下文档:
从onStartCommand返回的常量(Intent,int,int):如果
服务的进程在启动时(从返回后)被终止
onStartCommand(Intent,int,int)),然后将其保持在启动状态
但不要保留这一交付意图。稍后,系统将尝试
重新创建服务。因为它处于启动状态,所以它将
保证在创建
新服务实例;如果没有任何挂起的启动命令
如果已交付到服务,则将以空意图调用它
对象,因此您必须注意检查此项
编辑:
根据您发布的额外舱单信息,我想指出:
WearableListenerService
:从其他节点接收事件,例如
数据更改、消息或连接事件
但唯一确定的方法是在那里放一些日志,或者删除它。无论哪种方式,它都需要测试。您使用的是服务吗?它可能会调用您的onCreate()
method。我正在使用的唯一服务
是在运行时启动的。我没有在AndroidManifest.xml
中使用意图过滤器启动任何服务,谢谢您的回答。我将它作为start\u sticky启动,但是我在它的onDestroy中调用了stopForeground()
。当应用程序进入后台且未录制时,它将停止。当服务启动时,我也会记录它,所以它不会被重新启动。根据我的经验,我会将这些信息添加到我的原始问题中,任何启动你的应用程序的东西都在里面。您可以将其发布给我们进行检查,或者确保您对清单的每个元素都有一个日志,并自己进行测试。我已经添加了清单中可能导致问题的部分。其余的只是没有意图过滤器和许可的活动。我在回答中添加了一些额外的想法。