- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我编写了一个使用本地 SqliteDatabase 创建和提醒任务的应用程序。我编写了一个 jobScheduler 服务来检查设备时间和日期以及数据库中的任务,如果匹配则显示推送通知。我还想要在后台运行并每 5 秒检查一次数据的服务。但是当我写
builder.setPeriodic(5000);builder.setPersisted(true);
服务停止检查数据。
这是我的代码
主 Activity
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) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.navigation_calendar:
selectedFragment = new CalendarFragment();
break;
case R.id.navigation_home:
selectedFragment = new ViewListContents();
break;
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout, selectedFragment);
transaction.commit();
return true;
}
});
FragmentTransaction transaction =
getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout,new ViewListContents());
transaction.commit();
scheduleJob();
}
@Override
protected void onStart() {
super.onStart();
// Start service and provide it a way to communicate with this class.
Intent startServiceIntent = new Intent(this, JobSchedulerService.class);
startService(startServiceIntent);
}
@Override
protected void onStop() {
stopService(new Intent(this,JobSchedulerService.class));
super.onStop();
}
public void scheduleJob() {
JobInfo.Builder builder = new JobInfo.Builder(jobId++, mServiceComponent);
// builder.setPeriodic(5000);
// builder.setPersisted(true);
builder.setMinimumLatency(1000);
builder.setOverrideDeadline(1000);
// Extras, work duration.
PersistableBundle extras = new PersistableBundle();
extras.putLong("",5000);
builder.setExtras(extras);
// Schedule job
Log.d(TAG, "Scheduling job");
JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
tm.schedule(builder.build());
Toast.makeText(this, "Scheduling job ", Toast.LENGTH_SHORT).show();
}}
JobSchedulerService
public class JobSchedulerService extends JobService {
int id;
String stringId;
String date;
String taskDate,taskTitle,taskTime,sepYear,sepMonth,
sepDay,convert,DeviceDate;
Cursor taskDateCursor;
DatabaseHelper databaseHelper;
Roozh roozh;
String[] seperatedString;
int iYear,iMonth, iDay;
SimpleDateFormat dateFormat, timeFormat;
private static final String TAG = JobSchedulerService.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "Service created");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "Service destroyed"); }
@Override
public boolean onStartJob(final JobParameters params) {
stringId = String.valueOf(params.getJobId());
id = params.getJobId();
final long duration = params.getExtras().getLong(WORK_DURATION_KEY);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
databaseHelper= new DatabaseHelper(getApplicationContext());
taskDateCursor=databaseHelper.getDateForNotification();
if (taskDateCursor.moveToFirst()){
do {
taskTitle=taskDateCursor.getString(taskDateCursor.getColumnIndex(DatabaseHelper.COL2));
taskDate=taskDateCursor.getString(taskDateCursor.getColumnIndex(DatabaseHelper.COL3));
taskTime=taskDateCursor.getString(taskDateCursor.getColumnIndex(DatabaseHelper.COL4));
roozh= new Roozh();
seperatedString=taskDate.split("/");
sepYear= seperatedString[0];
sepMonth= seperatedString[1];
sepDay= seperatedString[2].trim();
iYear= Integer.parseInt(sepYear);
iMonth= Integer.parseInt(sepMonth);
iDay= Integer.parseInt(sepDay);
roozh.PersianToGregorian(iYear,iMonth,iDay);
convert= roozh.toString();
dateFormat= new SimpleDateFormat(
"yyyy-MM-dd", Locale.getDefault());
DeviceDate= dateFormat.format(new Date());
timeFormat=new SimpleDateFormat("HH:m",Locale.getDefault());
String deviceTime=timeFormat.format(new Date());
RemoteViews remoteViews= new RemoteViews(getPackageName(),R.layout.notification);
remoteViews.setImageViewResource(R.id.notif_image, R.mipmap.ic_launcher);
remoteViews.setTextViewText(R.id.title,taskTitle);
remoteViews.setTextViewText(R.id.text,taskTime);
if (DeviceDate.equals(convert) && deviceTime.equals(taskTime) ){
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(R.drawable.drawable_circle)
.setContent(remoteViews)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setColor(ContextCompat.getColor(getApplication(), R.color.primaryDarkColor))
.setShowWhen(true)
.setAutoCancel(true);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
notificationManager.notify(0, mBuilder.build());
}
Log.i(TAG, "data " + DeviceDate+ "task" + convert+ " " + "dd" + " "+ taskTime + "dt" + "" + deviceTime);
}while (taskDateCursor.moveToNext());
} }
}, duration);
Log.i(TAG, "on start job: " + params.getJobId());
return true; }
@Override
public boolean onStopJob(JobParameters params) {
Log.i(TAG, "on stop job: " + params.getJobId());
return true; }
最佳答案
我认为您的问题是您希望执行工作的频率。在标准 AOSP 中,作业的最短周期为 15 分钟。所以它可能不是适合您的 API。警报管理器可能是您想要的,但每 5 秒设置一个警报很昂贵。谷歌也随着每个版本越来越多地限制后台服务。只是要记住一些事情。
关于Android-JobScheduler 的 setPeriodic 将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49832467/
我知道 Android native (后 Lollipop)JobScheduler 和 GCM JobScheduler 都可以在重启后保留作业,但应用更新后呢?应用更新后我是否仍会调用作业? 谢
如何模仿 Android JobScheduler (或 GcmNetworkManager )Android 上 RxJava 的行为? 具体来说,我想要这个功能 了解网络 Activity 自动退
我有一个 jobscheduler,它发送由启动警报触发并被结束警报取消的通知,我有一个问题,如果我从最近的应用程序中删除应用程序或我重新启动手机,警报会在指定时间触发吗?以及作业调度程序会发生什么
注意:这不是重复的,请阅读问题 我想在设备每次充电和 WIFI 时运行一个作业。每次满足这些条件时,该作业最多必须运行一次。这意味着如果我让手机在 wifi 开启的情况下充电一夜,工作就不会重复。只有
我想每天调用一个方法来在我的应用程序中生成僵尸。 以下方法应创建执行此操作的 JobScheduler。 我的问题是:我是只调用一次这个方法,还是可以在应用程序启动时每次都调用它? public st
我正在使用 JobScheduler.setPeriodic() 来重复我的 JobIntentService。它第一次工作但从不重复。运行于安卓7.0 并发检查.java int mdelaymil
这可能吗?我需要启动我的前台服务,因为我在 UI 线程中使用它, 示例:每 25 分钟在我的应用中播放一个视频,该视频已关闭。 最佳答案 我认为这不是使用 JobScheduler 的最佳用例,但您可
我检查了从 Android API 级别 21 开始可以使用的 JobScheduler API。我想安排一个需要互联网并且每天只运行一次或可选的每周运行一次的任务(如果成功执行)。我没有找到关于这种
在 Android 模拟器上运行时,我无法让 JobScheduler 启动计划作业。如果我在运行 Android 6.0.1 的真实Samsung Galaxy S7 和 Nexus 5X 上进行测
我想在每天的特定时间启动 JobScheduler,并在 3 小时后完成。 我每 20 分钟触发一次作业,持续 3 小时,但在 JobInfo.Builder 类中没有在准确时间启 Action 业的
我的应用使用这种经典模式来安排周期性任务: 通过 AlarmManager 设置准确的闹钟(通过 setExactAndAllowWhileIdle(),因为即使在打瞌睡时它也必须关闭) 通过 Wak
这是我设置工作的方式: val builder = JobInfo.Builder(1, ComponentName(this, PullDataJob::class.java))
如何重新安排我使用 setPeriodic() 启动的 JobScheduler,我想稍后通过用户输入更改调度程序时间。 JobInfo.Builder builder = new JobIn
JobInfo.Builder 中的方法“setRequireDeviceIdle”到底是如何工作的?根据我在 Android 文档 (https://developer.android.com/re
我们正在通过 JobScheduler 实现作业用于后台加载数据。这项工作每天大约会触发一次。我们可以使用哪些工具来测试此功能(可能是 ADB)? 用例能够模拟作业运行所需的条件,或者只是明确地说“运
我正在试用 Android Lollipop 附带的新 JoScheduler API。到目前为止,我已经成功地创建并运行了一个延迟为 6000 毫秒的作业,没有任何网络要求。 但是,我刚刚尝试通过使
STEP_COUNTER 传感器的 Android 文档有点困惑。 根据这个:Android Sensor doc我应该始终注册 STEP_COUNTER 传感器,否则计步器传感器根本不会计数。这一切
我正在学习如何在 Android 中结合使用 JobSchedule 和 AsyncTasks。按照一些指南,我有以下 JobService 实现: @RequiresApi(Build.VERSIO
jobscheduler 每 10 分钟定期运行一次。一旦应用程序运行并保持每 10 分钟定期运行一次,我必须做些什么才能运行计划。现在发生的情况是:安装应用程序后,运行计划需要 10 分钟。如何让它
我遵循了一些关于 android 中的作业调度的在线教程,我尝试这样做,发现下面的代码编译没有错误。但问题是 onPostExecute/doInBackground 返回消息中没有 toast。有什
我是一名优秀的程序员,十分优秀!