Leo*_*hen 9 android android-service
我们的应用针对的是Android O.
阅读后台服务限制后,我注意到前台应用程序启动服务是安全的.因此,在我们的应用程序中,我们调用startService()了Fragment的onStart()方法.我们认为这是可以的,因为在本文档中它说当调用onStart时,片段对用户可见,并且当它可见时,它意味着此应用程序是前台应用程序.
但有时,我必须承认这种情况非常罕见,我们仍然会收到以下异常
java.lang.IllegalStateException:不允许启动服务Intent {act = ACTION_DEACTIVATE cmp = com.adyxe.sync/.ClientService}:app在后台uidReidRedord {db2a697 u0a19最后bg:+ 7m30s540ms空闲更改:缓存过程:1 seq (0,0,0)}
为什么会这样?onResume()为了更加确定应用程序现在是一个前台应用程序,调用startService()更安全吗?
首先,您可能发现了 Android 中的一个错误:)
\n\n无论如何,您应该使用 aJobIntentService并将其排队。
这样,当应用程序被视为在前台时,系统将运行您的服务,并且您将不会看到错误。在 Oreo 之前的版本中,无论应用程序前台状态如何,服务都应立即运行。
\n\n这是一个例子:
\n\npublic class ExampleJobIntentService extends JobIntentService {\n static final int JOB_ID = 1000;\n\n static void enqueueWork(Context context, Intent work) {\n enqueueWork(context, ExampleJobIntentService.class, JOB_ID, work);\n }\n\n @Override\n public void onCreate() {\n super.onCreate();\n // Some initializations...\n }\n\n @Override\n protected void onHandleWork(Intent work) {\n // Do your stuff...\n }\n\n @Override\n public boolean onStopCurrentWork() {\n // return true to reschedule this service if your work failed.\n return false;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后你像这样将其排队:
\n\n// The intent is the one that will be received here: onHandleWork(Intent work)\nExampleJobIntentService.enqueueWork(context, intent); \nRun Code Online (Sandbox Code Playgroud)\n\n像这样注册它Manifest:
<service\n android:name=".ExampleJobIntentService"\n android:permission="android.permission.BIND_JOB_SERVICE" />\nRun Code Online (Sandbox Code Playgroud)\n\n如果您计划在后台运行该服务,您应该WAKE_LOCK在Oreo 之前的Manifest版本中添加权限:
<uses-permission android:name=\xe2\x80\x9dandroid.permission.WAKE_LOCK\xe2\x80\x9d />\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |