public class DownloadServiceAbility extends Ability implements IDownloadListener { private static final String TAG = "idmxm"; private List<DownloadSession> downloadSessionList = new ArrayList<>(); private class DownloadRemoteObject extends RemoteObject { private DownloadRemoteObject() { super("Remote"); } @Override public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) { switch (code) { case Const.REMOTE_REQUEST_CODE_NEW_TASK: { startDownload(data.readString()); reply.writeInt(Const.SEND_REQUEST_SUCCESS); break; } case Const.REMOTE_REQUEST_CODE_CANCEL_TASK: { cancelDownload(); reply.writeInt(Const.SEND_REQUEST_SUCCESS); break; } default: break; } return true; } } @Override protected void onStart(Intent intent) { super.onStart(intent); } @Override protected IRemoteObject onConnect(Intent intent) { return new DownloadRemoteObject(); } @Override protected void onStop() { LogUtil.info(TAG, "service on stop"); for (DownloadSession downloadSession : downloadSessionList) { downloadSession.remove(); downloadSession.removeListener(this); } super.onStop(); } private void startDownload(String url) { Uri uri = Uri.parse(url); DownloadConfig config = new DownloadConfig.Builder(this, uri).setPath(null, "BackgroundDownload") .setTitle(url) .setDescription("This is a download session") .setNetworkRestriction(DownloadConfig.NETWORK_WIFI | DownloadConfig.NETWORK_MOBILE) .build(); DownloadSession downloadSession = new DownloadSession(this, config); downloadSession.start(); downloadSession.addListener(this); downloadSessionList.add(downloadSession); sendMessage("start download"); LogUtil.info(TAG, "start download: " + url); } private void cancelDownload() { LogUtil.info(TAG, "cancel download: --"); int index = downloadSessionList.size() - 1; if (index < 0) { return; } downloadSessionList.get(index).remove(); downloadSessionList.get(index).removeListener(this); downloadSessionList.remove(index); LogUtil.info(TAG, "cancel download: " + index); } private void sendMessage(String message) { InnerEvent innerEvent = InnerEvent.get(Const.HANDLER_EVENT_ID, Const.HANDLER_EVENT_PARAM, message); getEventHandler().sendEvent(innerEvent); } @Override public void onRemoved() { LogUtil.info(TAG, "session on removed"); sendMessage("session removed"); } @Override public void onCompleted() { LogUtil.info(TAG, "onCompleted"); sendMessage("session complete"); } @Override public void onFailed(int errorCode) { LogUtil.info(TAG, "onFailed: " + errorCode); sendMessage("session fail"); } @Override public void onProgress(long receivedSize, long totalSize) { LogUtil.info(TAG, "progress: " + receivedSize + " / " + totalSize); sendMessage(receivedSize + " / " + totalSize); } }