私はこの質問をチェックしましたが、それは私の問題に答えていないようです。メインプロセスのメニュー項目からIntentServiceを呼び出しています。これは現在、onHandleIntent()にトーストを配置する単なるスケルトンであり、最終的には処理の最後に一時的に表示され、終了したことを示します。ただし、(アプリケーションが停止している場合でも)画面に表示されたままになります。エミュレーターとGalaxyS2の両方でテストしたところ、同じ結果が得られました。誰かが私を正しい方向に向けることができますか?
これはサービスコードです:
package com.enborne.spine;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class SaveFile extends IntentService {
private final String TAG = "SaveFile";
public SaveFile() {
super("SaveFile");
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "Service Started.. ");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "Service Destroyed.. ");
}
@Override
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
Log.d(TAG, "HandleIntent");
// File saved
Toast.makeText(this, "File has been saved", Toast.LENGTH_SHORT).show();
}
}
(onCreateおよびonDestroyオーバーライドは、Eclipseにログインするために一時的にのみ存在するため、何が起こっているかを確認できます。)
したがって、アクティビティのメニューから呼び出します(コンテキストをいじるのは、サービスが開始されなかったためだけでした。一部の馬鹿は、マニフェストにそれを含めるのを忘れていました!):
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent i;
switch (item.getItemId()) {
case R.id.chart:
i = new Intent(getBaseContext(), Chart.class);
i.putExtra(KEY_CENTRE_LAT, mCentreLat); // centre coordinate
i.putExtra(KEY_CENTRE_LONG, mCentreLong); // centre coordinate
i.putExtra(KEY_RADIUS, mRadius); // effective radius
startActivity(i);
break;
case R.id.save:
Log.d("SaveFile", "Starting service...");
// i = new Intent(getBaseContext(), SaveFile.class);
i = new Intent(this, SaveFile.class);
startService(i);
break;
}
return true;
}
編集:私はこの記事を見つけました、それは問題を説明するかもしれません。一文を引用するには:
ただし、ToastはメインGUIスレッドでのみ使用できます。そうしないと、Toastメッセージが一定期間後に消えないという問題が発生します(メインGUIコンテキストは別のスレッドコンテキストで使用されるToastメッセージについて何も知らないため) )。