目前,我正在使用一个应用程序,并且我的应用程序具有用户可以单击“导航”按钮并且我的应用程序将启动Google Map的功能。到现在为止一切都很好,我已经做到了。但是,我被困的事实是我希望我的应用执行某些任务。为此,我使用了JobService并将其安排为每5秒运行一次,即使该应用程序处于后台也是如此。
当用户按下后退按钮时,则在onDestroy方法内部,我已取消了调度程序。但是,当通过滑动或按下十字图标将应用程序从后台删除时,JobService会继续运行,因为从后台删除应用程序时,os可以调用onDestroy方法。从后台删除应用程序后,如何停止计划的工作?
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="javarank.com.serviceinbackground">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyJobService" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" />
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
MyJobService类别
public class MyJobService extends JobService {
@Override
public boolean onStartJob(final JobParameters jobParameters) {
Toast.makeText(getApplicationContext(), "Doing job", Toast.LENGTH_SHORT).show();
jobFinished(jobParameters, true);
return false;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的MainActivity
public class MainActivity extends AppCompatActivity …Run Code Online (Sandbox Code Playgroud) 如何处理这种异常?我在整个应用程序中使用唯一的工作ID时,Oreo中的给定工作不是活动异常。
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.IllegalArgumentException: Given work is not active: JobWorkItem{id=2 intent=Intent { cmp=com.virinchi.mychat/com.virinchi.receiver.AnalysticsSubmit } dcount=1}
at android.app.job.JobParameters.completeWork(JobParameters.java:221)
at android.support.v4.app.JobIntentService$JobServiceEngineImpl$WrapperWorkItem.complete(JobIntentService.java:267)
at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:393)
at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:382)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask)
Run Code Online (Sandbox Code Playgroud)
public class AnalysticsSubmit extends JobIntentService {
private static String TAG = "AnalysticsSubmit";
/**
* Unique job ID for this service.
*/
/**
* Convenience method for enqueuing work in to this service. …Run Code Online (Sandbox Code Playgroud) 出于兴趣并更好地理解错误场景:我有一个JobService. 在onStartJob我返回true通知JobManager有额外的工作。Android 文档提到我需要打电话jobFinished通知JobManager工作已完成。
现在我想知道(并且可能有一个基于此的错误):如果我从不打电话会发生什么jobFinished?Android 会在某个时候终止作业服务吗?它会允许生成 JobService 的新实例吗?还是会阻止其他服务启动?是否有最大数量的 JobService 可以共存?
我没有看到使用JobService的jobFinshed的示例,似乎我们必须在满足某些条件时跟踪更改,我们必须调用jobFinished()method,对吗?
我正在尝试更新我的简单 android 应用程序以使用 Dagger2。我想我已经设法理解了一些基础知识,并且正在通过它创建基本的东西(活动、视图模型、助手)。
现在,还有一个小问题:该应用程序有一个按钮,按下该按钮后,必须安排作业服务。我可以重构我的 jobservice 以便它的依赖项通过它的构造函数传递,但是我如何从我的活动中实例化它?换句话说,我如何替换此代码:
val serviceComponent = ComponentName(getApplication(), DbUpdaterJob::class.java)
var jobInfo = JobInfo.Builder(DB_UPDATER_JOB_ID, serviceComponent)
.setRequiredNetworkType(networkType)
.setPersisted(true)
.build()
val scheduler = getApplication<Application>().getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val res = scheduler.schedule(jobInfo)
Run Code Online (Sandbox Code Playgroud)
所以实例化被降级为匕首?
谢谢!
在我的 android 应用程序中,我有一个Service在应用程序进入后台时启动的应用程序。OnStartCommand开始分析和检查设备和应用程序状态的长时间运行的任务。
现在,我正在为 Android O 准备应用程序。我面临的第一个问题是Services,我将它们重新编写为JobServices.
现在我面临另一个问题。当用户从应用程序堆栈JobService.OnTaskRemoved中删除我的应用程序时不会被调用。
之前,当我使用Service调用时Service.OnTaskRemoved对我来说工作正常。
现在我看到了唯一的方法。我需要我的旧Service用于处理Service.OnTaskRemoved和新的JobServices用于执行任务。
我错了吗?也许有人可以给我很好的建议?