title: Android: "BadTokenException: Unable to add window; is your activity running?" at showing dialog in PreferenceActivity
body: <p>I'd like to ask for some help: In my app, I have only one activity, a <code>PreferenceActivity</code> (don't need other, it's just a simple background-sync app, so the <code>PrefsActivity</code> is the Main/Launcher). After the user setup preferences, checks a <code>checkBoxPreference</code>, and that starts (or stops) a service. At starting, a dialog shows. 
  But here is the problem: if the user press back (leave the activity), start it again, and than tries to check the <code>checkBoxPref</code>., the <code>prefsactivity</code> crashes. Dialog doesn't shows. I have no idea why, and how to fix it.</p>
  
  <p>This code is exactly same with that part, what gives me the problem:</p>
  
  <p>PrefsActivity.java:</p>
  
  <pre><code>   package is.it.works;
  
     // imports .....
  
     public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
  SharedPreferences prefs;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      addPreferencesFromResource(R.xml.prefs);
      prefs = PreferenceManager.getDefaultSharedPreferences(this);
      prefs.registerOnSharedPreferenceChangeListener(this);
  }// onCreate
  
  @Override
  public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
      if (key.equals("checkTest")) {
          showDialog(1);
      }
      if (key.equals("cancel")) {
          dismissDialog(1);
      }
  }// onSPC
  
  @Override
  protected Dialog onCreateDialog(int id) {
      switch (id) {
      case 1: {
          ProgressDialog dialog = new ProgressDialog(this);
          dialog.setMessage("press back twice, start the app again, and click checkbox...");
          dialog.setIndeterminate(true);
          dialog.setCancelable(true);
          dialog.setOnCancelListener(new OnCancelListener() {
  
              @Override
              public void onCancel(DialogInterface dialog) {
                  prefs.edit().putBoolean("cancel", false).commit();
              }
          });
          return dialog;
      }// case
      }// switch
      return null;
  }// onCreateDialog
  }// PrefsActivity
  </code></pre>
  
  <p>prefs.xml:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"&gt;
  
      &lt;CheckBoxPreference android:key="checkTest" android:title="test" /&gt;
  
  &lt;/PreferenceScreen&gt;
  </code></pre>
  
  <p>and the manifest:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="is.it.works" android:versionCode="1" android:versionName="1.0"&gt;
  &lt;uses-sdk android:minSdkVersion="4" /&gt;
  
  &lt;application android:icon="@drawable/icon" android:label="@string/app_name"&gt;
      &lt;activity android:name=".PrefsActivity" android:label="@string/app_name"&gt;
          &lt;intent-filter&gt;
              &lt;action android:name="android.intent.action.MAIN" /&gt;
              &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
          &lt;/intent-filter&gt;
      &lt;/activity&gt;
  
  &lt;/application&gt;
  &lt;/manifest&gt;
  </code></pre>
  
  <p>LogCat error:</p>
  
  <pre><code>09-14 10:34:34.472: ERROR/AndroidRuntime(281): Uncaught handler: thread main exiting due to uncaught exception
  09-14 10:34:34.502: ERROR/AndroidRuntime(281): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@43756de8 is not valid; is your activity running?
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.view.ViewRoot.setView(ViewRoot.java:456)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.view.Window$LocalWindowManager.addView(Window.java:409)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.app.Dialog.show(Dialog.java:238)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.app.Activity.showDialog(Activity.java:2413)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at is.it.works.PrefsActivity.onSharedPreferenceChanged(PrefsActivity.java:27)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.app.ApplicationContext$SharedPreferencesImpl$EditorImpl.commit(ApplicationContext.java:2727)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.preference.Preference.tryCommit(Preference.java:1199)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.preference.Preference.persistBoolean(Preference.java:1404)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.preference.CheckBoxPreference.setChecked(CheckBoxPreference.java:155)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.preference.CheckBoxPreference.onClick(CheckBoxPreference.java:143)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.preference.Preference.performClick(Preference.java:811)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:190)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.widget.ListView.performItemClick(ListView.java:3246)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1635)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.os.Handler.handleCallback(Handler.java:587)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.os.Handler.dispatchMessage(Handler.java:92)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.os.Looper.loop(Looper.java:123)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at android.app.ActivityThread.main(ActivityThread.java:4203)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at java.lang.reflect.Method.invokeNative(Native Method)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at java.lang.reflect.Method.invoke(Method.java:521)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
  09-14 10:34:34.502: ERROR/AndroidRuntime(281):     at dalvik.system.NativeStart.main(Native Method)
  09-14 10:34:34.522: INFO/Process(52): Sending signal. PID: 281 SIG: 3
  09-14 10:34:34.532: INFO/dalvikvm(281): threadid=7: reacting to signal 3
  09-14 10:34:34.592: INFO/dalvikvm(281): Wrote stack trace to '/data/anr/traces.txt'
  09-14 10:34:38.533: DEBUG/dalvikvm(107): GC freed 437 objects / 21560 bytes in 136ms
  09-14 10:34:39.183: INFO/global(175): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
  09-14 10:34:44.632: INFO/global(175): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
  09-14 10:34:47.412: INFO/Process(281): Sending signal. PID: 281 SIG: 9
  09-14 10:34:47.472: INFO/ActivityManager(52): Process is.it.works (pid 281) has died.
  09-14 10:34:47.492: INFO/WindowManager(52): WIN DEATH: Window{4394f638 is.it.works/is.it.works.PrefsActivity paused=false} 
  </code></pre>
  
  <p>After googleing a lot, I think, the wrong part is the <code>ProgressDialog dialog = new ProgressDialog(this);</code>. Cause <code>this</code> changes. But changing it to <code>getApplicationContext()</code>, or <code>PrefsActivity.this</code> doesn't help, the problem is still there.
  Please, tell me why is this happening, and what could be the solution! Thank You! 
  I'm stuck, and now I have no idea...</p>