AndroidはJobSchedulerを使用して、定期的にローカル通知のインスタンスコードをプッシュして送ります。


Android 5.0の後にJobServiceとJobSchedulerが提供され、後のある時点またはある特定の条件を満たすときにタスクが実行される。JobSchedulerを使って、私達はユーザーがしばらく私達のappを使っていない場合に、ローカル通知を押してappのユーザー留保率を高めることができます。無駄話は多く言わないで、コードを付けます。
まずappのMainActivity起動時にJobSchedulerでjobをscheduleします。注意onCreateでは、ユーザーがアプリを起動する時間を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です。ここではShardPreferencesはダガー2に依存して注入されています。ダガーを使わないのは、PreferenceManager.get Default Shareferencesで直接に獲得できます。

@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" />
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。