public static void StartBackgroundJob(MonitoredActivity activity, string title, string message, Action job, Handler handler)
        {
            // Make the progress dialog uncancelable, so that we can gurantee
            // the thread will be done before the activity getting destroyed.
            ProgressDialog dialog = ProgressDialog.Show(activity, title, message, true, false);

            ThreadPool.QueueUserWorkItem((w) => new BackgroundJob(activity, job, dialog, handler).Run());
        }
        public BackgroundJob(MonitoredActivity activity, Action job, ProgressDialog progressDialog, Handler handler)
        {
            this.activity       = activity;
            this.progressDialog = progressDialog;
            this.job            = job;
            this.handler        = handler;

            activity.Destroying += (sender, e) =>
            {
                // We get here only when the onDestroyed being called before
                // the cleanupRunner. So, run it now and remove it from the queue
                cleanUp();
                handler.RemoveCallbacks(cleanUp);
            };

            activity.Stopping += (sender, e) => progressDialog.Hide();
            activity.Starting += (sender, e) => progressDialog.Show();
        }