查看: 438|回复: 0

[Android教程] Android使用JobScheduler定期推送本地通知实例代码

发表于 2017-11-28 08:00:01

?Android5.0之后提供了JobService和JobScheduler,用于在稍后的某个时间点或者当满足某个特定的条件时执行一个任务。使用JobScheduler,我们可以在用户一段时间没有使用我们的app的情况下,推送本地通知来提高app的用户留存率。废话不多说,上代码:

先在app的MainActivity启动时用JobScheduler来schedule一个job。注意在onCreate中我们把用户启动app的时间记录在了shared preference里面:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. sharedPreferences.edit().putLong(Constants.SP_PARAM_LAST_LAUNCH, System.currentTimeMillis()).apply();
  5. scheduleNotifications();
  6. }
  7. private void scheduleNotifications() {
  8. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  9. try {
  10. JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
  11. JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(getPackageName(), NotificationService.class.getName()))
  12. .setRequiresCharging(false)
  13. .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) //任何有网络的状态
  14. .setPersisted(true) //系统重启后保留job
  15. .setPeriodic(1000 * 60 * 60 * 24) //这里的单位是毫秒,1000 * 60 * 60 * 24代表一天(24小时)
  16. .build();
  17. jobScheduler.schedule(jobInfo);
  18. } catch (Exception ex) {
  19. Log.e("scheduleNotifications failure");
  20. }
  21. }
  22. }
复制代码

然后是推送通知的NotificationService,这里SharedPreferences是用的dagger2依赖注入,不用dagger的可以直接用PreferenceManager.getDefaultSharedPreferences来获得:

  1. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  2. public class NotificationService extends JobService {
  3. @DefaultSharedPref
  4. @Inject
  5. SharedPreferences sharedPreferences;
  6. @Override
  7. public boolean onStartJob(JobParameters params) {
  8. try {
  9. long lastLaunchTime = sharedPreferences.getLong(Constants.SP_PARAM_LAST_LAUNCH, -1);
  10. if(lastLaunchTime > 0) {
  11. long intervalSinceLastLaunch = System.currentTimeMillis() - lastLaunchTime;
  12. //检查距离用户上一次启动app是否过了一定时间
  13. if(intervalSinceLastLaunch > 1000 * 60 * 60 * 24) {
  14. NotificationCompat.Builder mBuilder =
  15. new NotificationCompat.Builder(NotificationService.this)
  16. .setAutoCancel(true)
  17. .setSmallIcon(R.mipmap.ic_launcher)
  18. .setContentTitle("我的app")
  19. .setContentText("又有新的内容上线了,快来我们app看看吧!");
  20. Intent resultIntent = new Intent(NotificationService.this, MainActivity.class);
  21. TaskStackBuilder stackBuilder = TaskStackBuilder.create(NotificationService.this);
  22. stackBuilder.addParentStack(MainActivity.class);
  23. stackBuilder.addNextIntent(resultIntent);
  24. PendingIntent resultPendingIntent =
  25. stackBuilder.getPendingIntent(
  26. 0,
  27. PendingIntent.FLAG_UPDATE_CURRENT
  28. );
  29. mBuilder.setContentIntent(resultPendingIntent);
  30. NotificationManager mNotificationManager =
  31. (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
  32. mNotificationManager.notify(1, mBuilder.build());
  33. }
  34. }
  35. } catch (Exception ex) {
  36. Log.e("Exception in NotificationService onStartJob");
  37. }
  38. return false;
  39. }
  40. @Override
  41. public boolean onStopJob(JobParameters params) {
  42. Log.d("NotificationService onStopJob");
  43. return true;
  44. }
  45. }
复制代码

最后需要在Manifest中注册我们的service和申请相关的权限:

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  4. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  5. <service android:name=".NotificationService"
  6. android:permission="android.permission.BIND_JOB_SERVICE" />
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。



回复

使用道具 举报

关闭

站长推荐上一条 /1 下一条