@Override public void run() { mPosted = false; switch (mOps) { case OPS_NOTIFY: mNotifyManager.notify(mId, mBuilder.build()); break; case OPS_CANCEL: mNotifyManager.cancel(mId); break; case OPS_START_FOREGROUND: if (mService != null) { mService.startForeground(mId, mBuilder.build()); break;
public void startForeground() {
if (mPosted) {
mOps = OPS_START_FOREGROUND;
} else {
long now = SystemClock.currentThreadTimeMillis();
if (now - mLastTime > DELAY) {
// Wait long enough, do it now
if (mService != null) {
mService.startForeground(mId, mBuilder.build());
} else {
// Too quick, post delay
mOps = OPS_START_FOREGROUND;
mPosted = true;
SimpleHandler.getInstance().postDelayed(this, DELAY);
public void start() {
failure = false; // reset failure flag
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createNotificationChannel();
context.startForeground(NOTIFICATION_ID, createNotification(false));
private void showProgressNotification(float progress)
int progress1000 = (int) (progress*1000);
Notification n = notificationBuilder.setProgress(1000, progress1000, false).build();
service.startForeground(id,n);
public void startForeground(@NonNull Notification notification) { Service service = (Service) context; service.startForeground(notificationId, notification.onCreateNotification(context));
/**
* フォアグラウンドサービス用に通知を発行する
* @param service
* @param tag
* @param notificationId
* @return
public NotificationBuilder notifyForeground(@NonNull final Service service,
@Nullable final String tag, final int notificationId) {
final Notification notification = build();
service.startForeground(notificationId, notification);
notify(service, tag, notificationId, notification);
return this;
public static void createNotification(Service context) {
String channelId = createChannel(context);
Notification notification = buildNotification(context, channelId);
context.startForeground(ONGOING_NOTIFICATION_ID, notification);
@Override public int onStartCommand(Intent intent, int flags, int startId) { Service core = sCore; if (null != intent && null != core) { Log.i(TAG, "onStartCommand"); try { core.startForeground(NOTIFICATION_ID, new Notification()); startForeground(NOTIFICATION_ID, new Notification()); core.stopForeground(true); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); return Service.START_NOT_STICKY;
public static void createNotification(Service context) { // Create Pending Intents. PendingIntent piLaunchMainActivity = getLaunchActivityPI(context); PendingIntent piStopService = getStopServicePI(context); // Action to stop the service. NotificationCompat.Action stopAction = new NotificationCompat.Action.Builder( STOP_ACTION_ICON, getNotificationStopActionText(context), piStopService) .build(); // Create a notification. Notification mNotification = new NotificationCompat.Builder(context) .setContentTitle(getNotificationTitle(context)) .setContentText(getNotificationContent(context)) .setSmallIcon(SMALL_ICON) .setContentIntent(piLaunchMainActivity) .addAction(stopAction) .setStyle(new NotificationCompat.BigTextStyle()) .build(); context.startForeground(ONGOING_NOTIFICATION_ID, mNotification);
public static void show(Service service, MediaSessionCompat session, Station station) {
// save service and session
mSession = session;
// create notification channel
createNotificationChannel(service);
// build notification
mNotification = getNotificationBuilder(service, station).build();
// display notification
service.startForeground(PLAYER_SERVICE_NOTIFICATION_ID, mNotification);
private void startForeground(String packageName, AppData.ActivityData activityData) {
Intent contentIntent = new Intent(service, MainActivity.class);
contentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TaskStackBuilder contentStackBuilder = TaskStackBuilder.create(service);
contentStackBuilder.addParentStack(MainActivity.class);
contentStackBuilder.addNextIntent(contentIntent);
NotificationCompat.Builder builder = new NotificationCompat.Builder(service)
.setSmallIcon(R.drawable.ic_notification)
.setColor(ContextCompat.getColor(service, R.color.colorAccent))
.setContentTitle(service.getString(R.string.app_name))
.setContentText(activityData.name)
.setSubText(packageName)
.setContentIntent(contentStackBuilder.getPendingIntent(0, PendingIntent.FLAG_CANCEL_CURRENT));
if (PreferenceData.STATUS_COLOR_AUTO.getValue(service)) {
Intent colorIntent = new Intent(service, AppSettingActivity.class);
colorIntent.putExtra(AppSettingActivity.EXTRA_COMPONENT, activityData.packageName + "/" + activityData.name);
colorIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
builder.addAction(R.drawable.ic_notification_color, service.getString(R.string.action_set_color), PendingIntent.getActivity(service, 0, colorIntent, PendingIntent.FLAG_CANCEL_CURRENT));
boolean isFullscreen = activityPreference != null && activityPreference.isFullScreen(service);
Intent visibleIntent = new Intent(service, ActivityFullScreenSettingReceiver.class);
visibleIntent.putExtra(ActivityFullScreenSettingReceiver.EXTRA_COMPONENT, activityData.packageName + "/" + activityData.name);
visibleIntent.putExtra(ActivityFullScreenSettingReceiver.EXTRA_FULLSCREEN, isFullscreen);
builder.addAction(R.drawable.ic_notification_visible, service.getString(isFullscreen ? R.string.action_show_status : R.string.action_hide_status), PendingIntent.getBroadcast(service, 0, visibleIntent, PendingIntent.FLAG_CANCEL_CURRENT));
Intent settingsIntent = new Intent(service, AppSettingActivity.class);
settingsIntent.putExtra(AppSettingActivity.EXTRA_COMPONENT, activityData.packageName);
settingsIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
builder.addAction(R.drawable.ic_notification_settings, service.getString(R.string.action_app_settings), PendingIntent.getActivity(service, 0, settingsIntent, PendingIntent.FLAG_CANCEL_CURRENT));
service.startForeground(ID_FOREGROUND, builder.build());
public void start() {
if (mService == null) {
Log.e(TAG, "SERVICE IS NULL - CANNOT START!");
return;
if (run_service_in_foreground) {
Log.d(TAG, "should be moving to foreground");
// mHandler.post(new Runnable() {
// @Override
// public void run() {
// TODO use constants
final long end = System.currentTimeMillis() + (60000 * 5);
final long start = end - (60000 * 60 * 3) - (60000 * 10);
foregroundStatus();
Log.d(TAG, "CALLING START FOREGROUND: " + mService.getClass().getSimpleName());
mService.startForeground(ongoingNotificationId, new Notifications().createOngoingNotification(new BgGraphBuilder(mContext, start, end), mContext));
// }
// });
public void start() {
if (mService == null) {
Log.e(TAG, "SERVICE IS NULL - CANNOT START!");
return;
if (run_service_in_foreground) {
Log.d(TAG, "should be moving to foreground");
// mHandler.post(new Runnable() {
// @Override
// public void run() {
// TODO use constants
final long end = System.currentTimeMillis() + (60000 * 5);
final long start = end - (60000 * 60 * 3) - (60000 * 10);
foregroundStatus();
Log.d(TAG, "CALLING START FOREGROUND: " + mService.getClass().getSimpleName());
mService.startForeground(ongoingNotificationId, new Notifications().createOngoingNotification(new BgGraphBuilder(mContext, start, end), mContext));
// }
// });
contentStackBuilder.addNextIntent(contentIntent);
service.startForeground(ID_FOREGROUND, new NotificationCompat.Builder(service)
.setSmallIcon(R.drawable.ic_notification)
.setColor(ContextCompat.getColor(service, R.color.colorAccent))
((Service) mContext).startForeground(NOTIFICATION_ID, mNotification);
} else {
((Service) mContext).stopForeground(false);