我正在玩Android,并编写一个带有活动和服务的小应用程序.活动在按钮单击时启动服务,它应该从URI获取一些数据并将其作为结果返回.有时,数据不可用或不符合标准,然后即使活动在后台,服务也应该每隔X分钟重试一次.
我通过Intent和ResultReceiver(在包中传递)实现了活动和服务之间的通信.在实现服务时,我想使用新JobScheduler组件,但后来看到它只能接受一个PersistableBundle不能添加Parcelable对象(ResultReceiver)而只能添加基本类型的组件.
我希望服务能够安排在网络可用时运行的作业以及每隔X分钟检查一次的数据.一旦获得它,我希望将数据返回给服务,以便它可以决定它是否可接受或者我们需要再次重试.如果服务接受数据,它将通过该服务将其返回给活动ResultsReceiver.
我不能使用ResultsReceiver,JobService因为我不构造JobService实例(由完成JobInfo.Builder),我不能传递它对回调对象的引用.
如何在预定作业和调用它的服务之间进行通信?
对不起,如果它是微不足道的,我不熟悉Android ..
谢谢!
我正在使用一个用于JobScheduler 的lib来处理棒棒糖前设备.我正在使用一个棒棒糖设备.问题是mJobScheduler.schedule(作业)应该启动我的工作服务,但它没有启动.此外,当我包含.setPeriodic(2000)方法时,应用程序崩溃了
堆栈跟踪.
08-06 00:37:06.729 19693-19693/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: rishabh.example.com.myapplication, PID: 19693
java.lang.RuntimeException: Unable to start activity ComponentInfo{rishabh.example.com.myapplication/rishabh.example.com.myapplication.MainActivity}: java.lang.IllegalArgumentException: Can't call setOverrideDeadline() on a periodic job.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
at android.app.ActivityThread.access$800(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Caused by: java.lang.IllegalArgumentException: Can't call setOverrideDeadline() on a periodic job.
at me.tatarka.support.job.JobInfo$Builder.build(JobInfo.java:477)
at rishabh.example.com.myapplication.MainActivity.constructJob(MainActivity.java:30)
at rishabh.example.com.myapplication.MainActivity.onCreate(MainActivity.java:19)
at android.app.Activity.performCreate(Activity.java:6010)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
at android.app.ActivityThread.access$800(ActivityThread.java:155)
at …Run Code Online (Sandbox Code Playgroud) 由于CONNECTIVITY_CHANGEAndroid N中已弃用意图过滤器,如何通过JobScheduler检测连接性变化?
谁能帮我?
在Firebase Job调度程序中,可以检测到何时连接到网络,但是如何检测何时断开与网络的连接?
Job myJob = dispatcher.newJobBuilder()
.setService(MyJobService.class)
.setTag("my-unique-tag")
.setConstraints(
// only run on an unmetered network
Constraint.ON_UNMETERED_NETWORK,
// only run when the device is charging
Constraint.DEVICE_CHARGING
)
.build();
dispatcher.mustSchedule(myJob);
Run Code Online (Sandbox Code Playgroud)
这将检测到何时连接到Unmetrered网络,无论何时从所有网络断开连接,我都想启动服务
我正在使用JobScheduler.setPeriodic()来重复我的JobIntentService.它第一次工作,但从不重复.在Android 7.0上运行
ConcurrentCheck.java
int mdelaymilles = 30000;
JobScheduler jobScheduler = (JobScheduler) mActivity.getSystemService(JOB_SCHEDULER_SERVICE);
ComponentName componentName = new ComponentName(mActivity, ConcurrentCheckService.class);
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, componentName)
.setPeriodic(mdelaymilles)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
int resultCode = jobScheduler.schedule(jobInfo);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d(LOG_TAG, "Job scheduled!");
Intent intent = new Intent();
intent.putExtra(LAST_POSITION, lastPosition);
JobIntentService.enqueueWork(mActivity, ConcurrentCheckService.class, JOB_ID, intent);
} else {
Log.d(LOG_TAG, "Job not scheduled");
}
Run Code Online (Sandbox Code Playgroud) 如何在jobScheduler中使用BroadcastReceiver?由于广播接收器的节电滤波器已发送到注册的接收器,因此在清单中声明接收器不起作用。此后,它应该在班级内部注册。我在jobScheduler中尝试过(请查看下面的代码),但是它不起作用。
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (jobScheduler == null) {
jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
ComponentName jobService =
new ComponentName(getPackageName(), MyJobService.class.getName());
JobInfo jobInfo
= new JobInfo.Builder(MYJOBID, jobService).setPeriodic(15 * 60 * 1000L)
.setExtras(bundle)
.setPersisted(true)
.setRequiresDeviceIdle(false)
.build();
int jobId = jobScheduler.schedule(jobInfo);
if (jobScheduler.schedule(jobInfo) > 0) {
} else {
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
MyJobService.java
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters jobParameters) {
jobP = jobParameters;
if (mLocationRequest == null) {
mLocationRequest …Run Code Online (Sandbox Code Playgroud) 我已经编写了一个使用本地SqliteDatabase创建和提醒任务的应用程序。我编写了一个jobScheduler服务,以检查设备时间和日期以及数据库中的任务,如果匹配则显示推送通知。我还想要的是在后台运行的服务,每5秒检查一次数据。但是当我写
builder.setPeriodic(5000); builder.setPersisted(true);
服务停止检查数据。
这是我的代码
主要活动
public class MainActivity extends AppCompatActivity {
ImageButton plusImageBtn;
DatabaseHelper databaseHelper;
BottomNavigationView navigation;
Toolbar toolbar;
private ComponentName mServiceComponent;
private int jobId=0;
private static final String TAG = MainActivity.class.getSimpleName();
public static final String WORK_DURATION_KEY =
BuildConfig.APPLICATION_ID + ".WORK_DURATION_KEY";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navigation = (BottomNavigationView) findViewById(R.id.navigation);
plusImageBtn = (ImageButton) findViewById(R.id.plusImagBtn);
toolbar= (Toolbar) findViewById(R.id.toolbar_main);
setSupportActionBar(toolbar);
mServiceComponent = new ComponentName(this, JobSchedulerService.class);
databaseHelper= new DatabaseHelper(this);
navigation.setOnNavigationItemSelectedListener
(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) …Run Code Online (Sandbox Code Playgroud) 我的 Android 应用程序中需要一个组件,最好将其描述为看门狗,即每 30 分钟 +/- 5 分钟执行一次并断言仍满足某个条件的函数。还必须在设备重新启动后执行看门狗,而用户此后没有明确打开应用程序。应用程序的安装也必须如此。即使在安装后未明确打开应用程序,也必须安排看门狗定期执行。
我知道使用WorkManager是最好的或“现代”的方式。无需WorkManager我为不同的 API 级别编写单独的代码,即BroadcastReceiver用于 API 级别 <27 和JobScheduler更高 API 级别的设备。WorkManager应该抽象出这些差异。
但我不明白在哪里打电话WorkManager.getInstance().enqueue( myWatchdogRequest );。使用任何主要活动的回调(即onCreate和类似的)都不是正确的地方,因为我不能依赖正在创建的活动。
我希望除了以编程方式排队作业之外,还应该有一种方法如何在清单中声明这些作业,从而将它们通知给系统(类似于老式的BroadcastReceiver)。实际上,JobScheduler如果我决定使用这种方法,我也会遇到同样的问题。
我在哪里排队WorkRequest“全局”?
android watchdog job-scheduling android-jobscheduler android-workmanager
由于Android Oreo后台执行限制,因此文档建议将IntentServices 重构为JobIntentService。
https://developer.android.com/about/versions/oreo/background
JobIntentService立即以IntentService低于Oreo的价格运行,但在Oreo +上安排作业
https://developer.android.com/reference/android/support/v4/app/JobIntentService
在什么情况下,将法线IntentService作为Service具有持久性通知的前台会有意义,什么时候JobIntentService更好?
我可以看到的一个缺点JobIntentService是它不会立即开始。
android android-service intentservice android-intentservice android-jobscheduler
我试图围绕GcmNetworkManager工具中的setTag和OneoffTask的setUpdateCurrent的行为.
setUpdateCurrent的文档说明了这一点:
可选的setter,用于指定此任务是否应覆盖具有相同标记的任何预先存在的任务.默认为false,这意味着新任务不会覆盖现有任务.
很公平,但它并没有说明任务会发生什么,它只说一件事不会发生 - 即任务不会被覆盖.:)我不清楚是否使用setUpdateCurrent意味着允许重复任务意味着它们被丢弃?
为了清楚起见,我的问题是:假设您使用了setUpdateCurrent(false),当您创建一个OneoffTask,其标签与已经安排的另一个OneoffTask相同时,除了已经安排的任务之外,新任务是否仍会发生,或者新任务是否会被抛弃,被视为重复?
android android-service google-cloud-messaging android-jobscheduler