はじめに
IntentServiceを継承したクラスのonHandleIntentメソッドの中でToastを表示させたところ、
Toastが消えずに、ずっと表示された状態になりました。
アプリを強制終了すると消えるのですが、これでは困るので対処します。
原因
IntentServiceがToastを表示した直後に役目を終えたのが原因でした。
つまりToastを表示したUIスレッドが死んでしまったため、Toastを消せなくなったようです。
タイミングによっては、そもそもToastが表示できないケースもあるようです。
解決策
Toastの表示をRunnableに投げることによって回避できました。
まずはRunnableを実装したDisplayToastをこうします。
public class DisplayToast implements Runnable {
  private final Context mContext;
  String mText;
  public DisplayToast(Context mContext, String text){
    this.mContext = mContext;
    mText = text;
  }
  public void run(){
    Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show();
  }
}
DisplayToastはIntentServiceから使えます。
これでToastが消える前にMyServiceが死んでも問題ありません。
public class MyService extends IntentService {
  Handler mHandler;
  public MyService(){
    super("MyService");
    mHandler = new Handler();
  }
  @Override
    protected void onHandleIntent(Intent intent) {
      mHandler.post(new DisplayToast(this, "Hello World!"));
    }   
}
このソースコードはstackoverflowで見つけたJim G.さんによるものです。深く感謝します。
