package com.prasanna.android.stacknetwork.service; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Service; import android.content.Intent; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.Process; public abstract class AbstractStackxService extends Service { private static boolean isRunning = false; private Looper serviceLooper; private Handler serviceHandler; protected abstract Handler getServiceHandler(Looper looper); private static List<Object> toNotifyObjects = Collections.synchronizedList(new ArrayList<Object>()); public interface OnHandlerComplete { void onHandleMessageFinish(Message message, Object... args); } public static boolean isRunning() { return isRunning; } protected static synchronized void setRunning(boolean running) { isRunning = running; } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); serviceLooper = thread.getLooper(); serviceHandler = getServiceHandler(serviceLooper); } @Override public int onStartCommand(Intent intent, int flags, int startId) { setRunning(true); Message msg = serviceHandler.obtainMessage(); msg.arg1 = startId; serviceHandler.sendMessage(msg); return START_NOT_STICKY; } public static boolean registerForCompleteNotification(Object object) { if (object != null && isRunning()) { toNotifyObjects.add(object); return true; } return false; } protected void notifyWaitingObjectsOnComplete() { for (Object object : toNotifyObjects) { synchronized (object) { object.notify(); } } toNotifyObjects.clear(); } }