設定画面で、設定の 1 つがクリックされたときに、インターネットからファイルをダウンロードするサービスを開始したいと考えています。サービスが既に実行されている (ファイルをダウンロードしている) 場合は、サービスを停止する必要があります (ダウンロードをキャンセルします)。
public class Setting extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
downloadPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference pref) {
if (DownloadService.isRunning) {
Setting.this.stopService(new Intent(Setting.this,
DownloadService.class));
} else {
Setting.this.startService(new Intent(Setting.this,
DownloadService.class));
}
return false;
}
});
}
}
サービスクラス:
public class DownloadService extends IntentService {
public static final int DOWNLOAD_SUCCESS = 0;
public static final int DOWNLOAD_FAIL = 1;
public static final int DOWNLOAD_CANCELLED = 2;
public static final int SERVER_FAIL = 3;
public static boolean isRunning = false;
private int result;
public DownloadService() {
super("DownloadService");
}
@Override
public void onCreate() {
super.onCreate();
isRunning = true;
}
@Override
protected void onHandleIntent(Intent intent) {
if (NetworkStateUtils.isInternetConnected(getApplicationContext()))
result = downloadFiles(getApplicationContext());
}
@Override
public void onDestroy() {
super.onDestroy();
switch (result) {
case DOWNLOAD_SUCCESS:
Toast.makeText(getApplicationContext(), R.string.download_finished,
Toast.LENGTH_SHORT).show();
break;
case DOWNLOAD_CANCELLED:
Toast.makeText(getApplicationContext(), R.string.download_canceled,
Toast.LENGTH_SHORT).show();
break;
case DOWNLOAD_FAIL:
Toast.makeText(getApplicationContext(), R.string.download_failed,
Toast.LENGTH_SHORT).show();
break;
}
isRunning = false;
}
}
このサービスは、ダウンロードが完了するまで実行されることを意図しています。関数downloadFiles()
は no を使用しAsyncTask
ます。を直接保存しHttpURLConnection
ますFileOutputStream
。
設定をクリックすると、サービスが正しく開始されました。問題は、クリックしてサービスを停止するとstopService()
、すぐにDownloadService
トリガーされることです。onDestroy()
ただし、ログによると、onHandleIntent()
HTTP 要求を引き続き確認できるため、まだ実行されています。これService
は、スレッド自体で実行されているためですか、それとも何か間違っていますか? が呼び出されたときに、すべてonHandleIntent()
がすぐに停止する (または少なくとも停止できる) ようにするにはどうすればよいstopService()
ですか?