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

作者:码农向前冲 时间:2023-07-26 22:43:28 

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

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


@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 sharedPreferences.edit().putLong(Constants.SP_PARAM_LAST_LAUNCH, System.currentTimeMillis()).apply();
 scheduleNotifications();
}

private void scheduleNotifications() {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     try {
       JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
       JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(getPackageName(), NotificationService.class.getName()))
           .setRequiresCharging(false)
           .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) //任何有网络的状态
           .setPersisted(true) //系统重启后保留job
           .setPeriodic(1000 * 60 * 60 * 24) //这里的单位是毫秒,1000 * 60 * 60 * 24代表一天(24小时)
           .build();
       jobScheduler.schedule(jobInfo);
     } catch (Exception ex) {
       Log.e("scheduleNotifications failure");
     }
   }
 }

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


@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class NotificationService extends JobService {
 @DefaultSharedPref
 @Inject
 SharedPreferences sharedPreferences;

@Override
 public boolean onStartJob(JobParameters params) {
   try {
     long lastLaunchTime = sharedPreferences.getLong(Constants.SP_PARAM_LAST_LAUNCH, -1);
     if(lastLaunchTime > 0) {
       long intervalSinceLastLaunch = System.currentTimeMillis() - lastLaunchTime;
       //检查距离用户上一次启动app是否过了一定时间
       if(intervalSinceLastLaunch > 1000 * 60 * 60 * 24) {
             NotificationCompat.Builder mBuilder =
                 new NotificationCompat.Builder(NotificationService.this)
                     .setAutoCancel(true)
                     .setSmallIcon(R.mipmap.ic_launcher)
                     .setContentTitle("我的app")
                     .setContentText("又有新的内容上线了,快来我们app看看吧!");
             Intent resultIntent = new Intent(NotificationService.this, MainActivity.class);

TaskStackBuilder stackBuilder = TaskStackBuilder.create(NotificationService.this);
             stackBuilder.addParentStack(MainActivity.class);
             stackBuilder.addNextIntent(resultIntent);
             PendingIntent resultPendingIntent =
                 stackBuilder.getPendingIntent(
                     0,
                     PendingIntent.FLAG_UPDATE_CURRENT
                 );
             mBuilder.setContentIntent(resultPendingIntent);
             NotificationManager mNotificationManager =
                 (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
             mNotificationManager.notify(1, mBuilder.build());
       }
     }
   } catch (Exception ex) {
     Log.e("Exception in NotificationService onStartJob");
   }
   return false;
 }

@Override
 public boolean onStopJob(JobParameters params) {
   Log.d("NotificationService onStopJob");
   return true;
 }
}

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


 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<service android:name=".NotificationService"
     android:permission="android.permission.BIND_JOB_SERVICE" />

来源:http://www.jianshu.com/p/7e5138c07446?utm_source=tuicool&utm_medium=referral

标签:Android,JobScheduler
0
投稿

猜你喜欢

  • android电源信息查看(电量、温度、电压)实例代码

    2022-04-30 15:41:04
  • jmeter+ant+jenkins自动化测试环境配置搭建过程

    2023-11-17 23:38:06
  • Gradle 依赖切换源码实践示例详解

    2023-02-21 13:21:44
  • Android编程处理窗口控件大小,形状,像素等UI元素工具类

    2022-04-06 04:47:53
  • Java使用synchronized实现互斥锁功能示例

    2022-10-20 00:47:49
  • 应用Java泛型和反射导出CSV文件的方法

    2022-02-25 19:50:17
  • java编程中字节流转换成字符流的实现方法

    2021-06-09 15:59:04
  • 深入理解Java设计模式之享元模式

    2023-11-10 17:20:51
  • C#中使用UDP通信的示例

    2022-11-19 21:09:07
  • Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    2023-11-08 14:48:13
  • jsp、struts、spring、mybatis实现前端页面功能模块化拆分的方案

    2023-11-25 07:38:00
  • Java ArrayDeque使用方法详解

    2022-02-09 08:00:23
  • Android中ListView如何分页加载数据

    2023-09-08 18:44:35
  • Android创建服务之started service详细介绍

    2022-12-09 15:10:29
  • Android互联网访问图片并在客户端显示的方法

    2021-12-26 21:25:10
  • Android仿外卖购物车功能

    2023-06-01 02:45:26
  • C#8 的模式匹配实现

    2023-02-11 16:22:16
  • Android跳转三方应用实例代码

    2022-02-01 11:15:42
  • Java实现在线聊天室(层层递进)

    2022-06-13 11:03:47
  • C++实现TCP客户端及服务器Recv数据筛选处理详解

    2022-02-22 12:41:38
  • asp之家 软件编程 m.aspxhome.com