title: How do I get an alert Dialog to show outside of application?
body: <p>I have done research to try to get an alert <code>Dialog</code> outside of my application, but nothing makes sense to me (I am a beginner in Android). I am using a basic timer in my app, I want the user to be able to set the timer, then leave the app if they want to, and when the timer finishes, it pops up on the screen wherever they may be.</p>
  
  <p>Right now I can get the alert <code>Dialog</code> to show up within an activity. But if you go to the home screen and the timer ends, the dialog does not show up there. Any ideas how to get it to show outside of the app? Do I need to put this alert <code>Dialog</code> code into its own class (instead of inside another activity of the app, where it is now)?</p>
  
  <p>Here is the code for the alert <code>Dialog</code>. The alert is in the <code>timerDone()</code> method, 3rd method from the bottom.</p>
  
  <p><strong>ZombieThemedActivity.java</strong></p>
  
  <pre><code>package com.azurespot.disastertimer.app.themedactivities;
  
  import android.app.Dialog;
  import android.content.Intent;
  import android.graphics.Color;
  import android.media.MediaPlayer;
  import android.os.Bundle;
  import android.os.CountDownTimer;
  import android.support.v7.app.ActionBarActivity;
  import android.util.Log;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.view.View;
  import android.widget.Button;
  import android.widget.ImageView;
  import android.widget.TextView;
  
  import com.azurespot.disastertimer.app.MainSelectorActivity.OnMediaPlayerUpdatedListener;
  import com.azurespot.disastertimer.app.MainSelectorActivity;
  import com.azurespot.disastertimer.app.R;
  
  public class ZombieThemedActivity extends ActionBarActivity implements OnMediaPlayerUpdatedListener {
  
      long start_time_seconds;  //time user enters into timer in seconds (passed from main activity)
      long remaining_time, remaining_time_paused;  //keeps track of remaining time on timer
      Boolean is_paused;  //keeps track if timer is paused or not (to pause or restart timer)
      TextView mTextField;
      private CountDownTimer timer;
      public MediaPlayer zombieDone;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_zombie_themed);
  
          MainSelectorActivity.setOnMediaPlayerUpdatedListener(ZombieThemedActivity.this);
  
          // The time in seconds from number picker that was send with the intent
          Bundle bTimeSetSec = getIntent().getExtras();  // need to pass variable as a bundle !!!
          start_time_seconds = bTimeSetSec.getInt("timeSetSecZ");
          is_paused = false;
          Log.i("DT", "Time is " + start_time_seconds + " in seconds  Z");
          SetUpTimer();
          // Creates a visible pause button in themed activities, until toggle code
          // in the PauseTimer() click method can take over
          findViewById(R.id.btnPause).setBackgroundResource(R.drawable.ic_timer_pause);
      }
  
         // Interface
      @Override
      public void onMediaPlayerStopped() {
          zombieDone.stop();
          timer.cancel();
      }
  
      // This is a basic timer, but it counts down from time given
      // Can maybe put a button click listener for pause, reset and save the millisUntilFinished
      public void SetUpTimer() {
          mTextField = (TextView) findViewById(R.id.txTimeCounting);
          if (is_paused) {
              // if pause button was hit then, stay on this screen, but use remaining time, not start time.
              start_time_seconds = remaining_time_paused;
              Log.i("DT","Is Paused state = " + is_paused);
          }
  
          timer = new CountDownTimer(start_time_seconds*1000, 1000) {
              // since timer needs millisUntilFinished... the max of a long is 9223372036854775807seconds
              public void onTick(long millisUntilFinished) {
  
                  // Convert seconds to hr/min/sec for message
                  // since millisUntilFinished is a long (&gt;3billion) and modulus (%) is for ints, need to put a L at the end to tell it the number is literal and somehow allow ints.
                  remaining_time = millisUntilFinished/1000;
  
                  // Math.floor - will just get the opposite of the modulus (name?), requires double input.
                  // casting double -&gt; int will result in getting rid of decimal (great, we don't have one!)
                  double remaining_time_double = (int)remaining_time;
                  int mHr = (int) Math.floor(remaining_time_double / 3600);
                  int mMin = (int) Math.floor((remaining_time_double-(3600*mHr)) / 60);
                  int mSec = (int) Math.floor(remaining_time_double-(3600*mHr)-(60*mMin));
  
                  // Convert int to string (and add a zero in front of int tht are &lt;10 for looks
                  String smHr;
                  String smMin;
                  String smSec;
                  if (mHr &lt; 10) {smHr = "0" + Integer.toString(mHr); } else { smHr = String.valueOf(mHr); }
                  if (mMin &lt; 10) { smMin = "0" + String.valueOf(mMin); } else { smMin = String.valueOf(mMin); }
                  if (mSec &lt; 10) { smSec = "0" + String.valueOf(mSec); } else { smSec = String.valueOf(mSec); }
  
                  Log.i("DT", "time is: " + smHr + ":" + smMin + ":" + smSec);
                  mTextField.setText(smHr + ":" + smMin + ":" + smSec);
                  // mTextField.setText(millisUntilFinished/1000 + " seconds");
  
                  if(millisUntilFinished &lt;= 10000)
                      mTextField.setTextColor(Color.RED);
                  // if less than 10seconds make text red!
              }
  
              public void onFinish() {
                  mTextField.setText("BRAINS!!");
                  // call some media function here
                  MediaPlayer mp = MediaPlayer.create(ZombieThemedActivity.this, R.raw.zombie_sound);
                  mp.start();
                  zombieDone = mp;
  
                  // This disables the pause/play button when timer ends
                  Button disablePausePlay = (Button)findViewById(R.id.btnPause);
                  disablePausePlay.setEnabled(false);
                  timerDone();
              }
          };
          timer.start();
      }
  
  
      public void PauseTimer (View v) {
  
          // Dynamically creates the toggled buttons (without any xml)
          switch(v.getId()){
              case R.id.btnPause:
  
                  if(!is_paused){
                      // Removes set pause button from onCreate, and replaces with new one
                      v.setBackgroundResource(0);
                      v.setBackgroundResource(R.drawable.ic_timer_play);
                  }
                  else{
                      v.setBackgroundResource(R.drawable.ic_timer_pause);
                  }
          }
  
          // do something when the pause button is hit
          // set IS_PAUSED to false (so when timer is called, it uses remaining time instead of start time.
          // cancels current timer - set the time to display the paused time, re-labels the button to "Re-Start"
  
          if (!is_paused) {
  
              remaining_time_paused = remaining_time;
  
              double paused_time = remaining_time_paused;
              int mHr = (int) Math.floor(paused_time / 3600);
              int mMin = (int) Math.floor((paused_time-(3600*mHr)) / 60);
              int mSec = (int) Math.floor(paused_time-(3600*mHr)-(60*mMin));
              // Convert int to string (and add a zero in front of int tht are &lt;10 for looks
              String smHr;
              String smMin;
              String smSec;
              if (mHr &lt; 10) {smHr = "0" + Integer.toString(mHr); } else { smHr = String.valueOf(mHr); }
              if (mMin &lt; 10) { smMin = "0" + String.valueOf(mMin); } else { smMin = String.valueOf(mMin); }
              if (mSec &lt; 10) { smSec = "0" + String.valueOf(mSec); } else { smSec = String.valueOf(mSec); }
  
              // set the timer
              Log.d("DT", "time is: " + smHr + ":" + smMin + ":" + smSec);
              mTextField.setText(smHr + ":" + smMin + ":" + smSec);
              is_paused = true;
              timer.cancel();
              Log.d("DT", "is paused hit yes, remaining time is " + remaining_time);
          }
          else {
              SetUpTimer();
              is_paused = false;   // must reset the pause state AFTER calling the timer method
          }
      }
  
      // This overrides the onPause() method so when back button is pressed,
      // the music file stops and releases from memory, which means the object is gone
  
      @Override
      protected void onPause(){
          super.onPause();
          if (zombieDone != null) //add a null check here
          {
              if (zombieDone.isPlaying()) {
                  zombieDone.stop();
                  zombieDone.release();
              // If this does nothing then the else is not needed
              } else {
                  // Do nothing
              }
          }
      }
  
      public void ReturnToTimerScreen (View v) {
          // RESET button is hit !!!!
          // returns to first screen for selection of new time, must cancel timer
          timer.cancel();
          Intent iReset = new Intent(getBaseContext(), MainSelectorActivity.class);
          startActivity(iReset);
          Log.i("DT", "RESET button was hit");
      }
  
      public void timerDone() {
  
          // Create custom dialog object
          final Dialog dialog = new Dialog(ZombieThemedActivity.this);
          // Include alert_popup.xml file
          dialog.setContentView(R.layout.alert_popup);
          // Set dialog title
          dialog.setTitle("BRAINS!!!");
          ImageView image = (ImageView) dialog.findViewById(R.id.imageView01);
          image.setImageResource(R.drawable.ic_launcher_nuke);
  
          dialog.show();
  
          Button declineButton = (Button) dialog.findViewById(R.id.okbutton);
          // if decline button is clicked, close the custom dialog
          declineButton.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  // Close dialog
                  dialog.dismiss();
                  timer.cancel();
                  zombieDone.stop();
                  zombieDone.release();
              }
          });
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
  
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.zombie_themed, menu);
          return true;
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          // Handle action bar item clicks here. The action bar will
          // automatically handle clicks on the Home/Up button, so long
          // as you specify a parent activity in AndroidManifest.xml.
          int id = item.getItemId();
          if (id == R.id.action_settings) {
              return true;
          }
          return super.onOptionsItemSelected(item);
      }
  }
  </code></pre>