package cri.sanity; import java.util.HashMap; import java.util.Map; import android.content.Intent; import android.os.Bundle; public final class AlarmService extends WakeService { private static Map<String,Action> actionMap; @Override public void onCreate() { super.onCreate(); if(actionMap == null) actionMap = new HashMap<String,Action>(); } @Override public int onStartCommand(Intent i, int flags, int id) { if(i == null) return START_STICKY; final String action = i.getAction(); if(action == null) return START_STICKY; synchronized(actionMap) { final Action a = actionMap.get(action); if(a != null) try { a.interrupt(); } catch(Exception e) {} actionMap.put(action, new Action(action, i.getExtras())); } return START_STICKY; } private class Action extends Thread { private String action; private Bundle extras; private Action(String action, Bundle extras) { this.action = action; this.extras = extras; start(); } @Override public void run() { yield(); new Alarmer(extras).runAction(action); synchronized(actionMap) { actionMap.remove(action); if(actionMap.isEmpty()) stopSelf(); } } } }