Android 下载功能实现:使用 Service 和 BindService 构建下载器
package com.example.sh3;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.Manifest;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private DownloadService.DownloadBinder downloadBinder;
private boolean isContinue = false;
private boolean isDownload = false;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downloadBinder = (DownloadService.DownloadBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startDownload = findViewById(R.id.start_download);
Button pauseDownload = findViewById(R.id.pause_download);
Button cancelDownload = findViewById(R.id.cancel_download);
pauseDownload.setEnabled(true);
cancelDownload.setEnabled(false);
startDownload.setOnClickListener(this);
pauseDownload.setOnClickListener(this);
cancelDownload.setOnClickListener(this);
Intent intent = new Intent(this, DownloadService.class);
startService(intent);//启动服务
bindService(intent,connection,BIND_AUTO_CREATE);//绑定服务
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
}
@Override
public void onClick(View v) {
EditText edittext=(EditText) findViewById(R.id.edit);
String url,site;
url=edittext.getText().toString();
// Toast.makeText(this, site, Toast.LENGTH_SHORT).show();
if(url.equals(''))
url= 'https://www.imooc.com/mobile/mukewang.apk';
// editText.setText(url);
if (downloadBinder == null) {
return;
}
Button startDownload = findViewById(R.id.start_download);
Button pauseDownload = findViewById(R.id.pause_download);
Button cancelDownload = findViewById(R.id.cancel_download);
int id = v.getId();
if (id == R.id.start_download) {
downloadBinder.startDownload(url);
isDownload = true;
startDownload.setEnabled(false);
pauseDownload.setEnabled(true);
cancelDownload.setEnabled(true);
} else if (id == R.id.pause_download) {
if (isDownload) {
if (!isContinue) {
downloadBinder.pauseDownload();
pauseDownload.setText('继续下载');
pauseDownload.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
isContinue = true;
} else {
downloadBinder.startDownload(url);
pauseDownload.setText('暂停下载');
pauseDownload.setBackgroundColor(getResources().getColor(R.color.colorGray));
isContinue = false;
}
} else {
Toast.makeText(this, '请先点击下载', Toast.LENGTH_SHORT).show();
}
} else if (id == R.id.cancel_download) {
downloadBinder.cancelDownload();
startDownload.setEnabled(true);
pauseDownload.setEnabled(true);
cancelDownload.setEnabled(false);
pauseDownload.setBackgroundColor(getResources().getColor(R.color.colorGray));
}
}
private static final int requestCode=1;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if(grantResults.length>0&&grantResults[0]!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,'拒绝权限将无法使用程序',Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
}
这段代码是一个简单的下载功能的实现,主要包括以下几个部分:
-
定义了一个DownloadListener接口,用于监听下载的进度和状态。
-
MainActivity实现了View.OnClickListener接口,用于处理按钮的点击事件。
-
在onCreate方法中,初始化了下载服务的绑定和启动,并请求了写入外部存储的权限。
-
在onClick方法中,根据按钮的点击事件进行相应的操作。点击开始下载按钮会调用downloadBinder的startDownload方法开始下载,点击暂停下载按钮会根据isContinue的值来判断是暂停还是继续下载,点击取消下载按钮会调用downloadBinder的cancelDownload方法取消下载。
-
在onRequestPermissionsResult方法中,处理权限请求的结果。
-
在onDestroy方法中,解绑服务。
这段代码的实验结果是,点击开始下载按钮后,会开始下载指定的文件;点击暂停下载按钮会暂停下载,再次点击会继续下载;点击取消下载按钮会取消下载。同时,根据下载的状态,按钮的可用性也会相应地改变。
分析:这段代码实现了一个简单的下载功能,通过绑定和启动服务的方式来进行下载操作。通过点击不同的按钮来控制下载的开始、暂停和取消。同时,通过DownloadListener接口来监听下载的进度和状态,可以根据需要进行相应的处理。
原文地址: https://www.cveoy.top/t/topic/LXO 著作权归作者所有。请勿转载和采集!