package com.antfortune.freeline; import android.app.AlarmManager; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.IBinder; import android.text.TextUtils; import android.util.Log; import com.antfortune.freeline.router.Router; import com.antfortune.freeline.server.LongLinkServer; import java.util.concurrent.TimeUnit; /** * Created by huangyong on 16/7/31. */ public class FreelineService extends Service { private static final String LOG_TAG = "Freeline.Service"; private static final int SERVICE_NOTIFICATION_ID = 8861; private static final String ACTION_KEEP_LIVE = ".Notification_RTC_WAKEUP_PUSH"; private AlarmManager am = null; private PendingIntent mCheckSender = null; @Override public void onCreate() { super.onCreate(); this.am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(LOG_TAG, "onStartCommand Received start id " + startId + ", intent: " + intent); LongLinkServer.start(this.getApplication(), Router.getInstance()); String marker = intent == null ? null : intent.getStringExtra("wakeup"); if (TextUtils.isEmpty(marker)) { try { setForegroundService(); } catch (Exception e) { Log.e(LOG_TAG, "setForegroundService fail", e); } } return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); try { stopForeground(true); startAlarmTimer(TimeUnit.SECONDS.toMillis(5)); } catch (Exception e) { Log.e(LOG_TAG, "stopForeground fail", e); } } @Override public IBinder onBind(Intent intent) { return null; } protected void startAlarmTimer(long nextTime) { Log.i(LOG_TAG, "startAlarmTimer ELAPSED_REALTIME_WAKEUP! nextTime=" + nextTime); Intent intent = new Intent(); intent.setAction(this.getPackageName() + ACTION_KEEP_LIVE); this.mCheckSender = PendingIntent.getBroadcast(this, 100, intent, 0); try { if (am != null && mCheckSender != null) { am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + nextTime, mCheckSender); } } catch (Exception e) { Log.e(LOG_TAG, "startAlarmTimer fail", e); } } private void setForegroundService() { if (Build.VERSION.SDK_INT < 18) { startForeground(SERVICE_NOTIFICATION_ID, new Notification()); } else { startForeground(SERVICE_NOTIFICATION_ID, new Notification()); Intent innerIntent = new Intent(this, InnerService.class); startService(innerIntent); } } public static class InnerService extends Service { private static final String LOG_TAG_INNER = LOG_TAG + "$Inner"; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(LOG_TAG_INNER, "onStartCommand Received start id " + startId + ", intent: " + intent); try{ startForeground(SERVICE_NOTIFICATION_ID, new Notification()); stopForeground(true); stopSelf(); } catch (Exception e) { Log.e(LOG_TAG_INNER, "startForeground, stopForeground, stopSelf fail", e); } return super.onStartCommand(intent, flags, startId); } } }