上一篇
安卓开发数据连接
- 行业动态
- 2025-04-22
- 2
安卓数据连接基础
权限配置
安卓应用访问网络必须声明权限,并在运行时动态申请(Android 6.0+)
权限类型 | 用途 | 声明方式 |
---|---|---|
INTERNET |
基础网络访问 | <uses-permission android:name="android.permission.INTERNET"/> |
ACCESS_NETWORK_STATE |
获取网络状态 | <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> |
ACCESS_WIFI_STATE |
获取WiFi状态 | <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> |
CHANGE_NETWORK_STATE |
修改网络状态 | <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> |
动态权限申请示例:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, REQUEST_CODE); }
网络连接API
API类型 | 适用场景 | 核心优势 |
---|---|---|
HttpURLConnection |
基础HTTP请求 | 系统原生支持,轻量级 |
OkHttp |
复杂网络请求 | 连接复用、缓存机制 |
Volley |
图片加载/短请求 | 异步处理、队列管理 |
OkHttp基础用法:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.example.com/data") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { / 处理失败 / } @Override public void onResponse(Call call, Response response) throws IOException { // 处理响应 } });
网络状态监听
通过ConnectivityManager
实时监控网络变化
广播接收器实现:
public class NetworkReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { boolean isConnected = ((NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO)).isConnected(); // 处理网络状态变化 } }
LiveData实现(现代方式):
@SuppressLint("MissingPermission") NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { / 网络可用 / } @Override public void onLost(Network network) { / 网络断开 / } }; ConnectivityManager.requestNetwork(new NetworkRequest.Builder().build(), networkCallback);
后台数据连接管理
组件类型 | 适用场景 | 注意事项 |
---|---|---|
Service |
长期后台任务 | 需处理内存泄漏 |
JobScheduler |
延迟/条件任务 | 兼容API>21 |
WorkManager |
可靠后台任务 | 推荐现代开发 |
WorkManager示例:
OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(MyWorker.class) .setConstraints(new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build()) .build(); WorkManager.getInstance(context).enqueue(work);
数据连接优化策略
优化方向 | 实现方案 | 效果 |
---|---|---|
流量压缩 | GZIP压缩 | 减少70%+流量 |
缓存策略 | OKHttp缓存 | 重复数据本地读取 |
断点续传 | Range请求头 | 恢复中断下载 |
弱网适配 | 超时重试机制 | 提升稳定性 |
OKHttp缓存配置:
int cacheSize = 10 1024 1024; // 10MB Cache cache = new Cache(getCacheDir(), cacheSize); OkHttpClient client = new OkHttpClient.Builder() .cache(cache) .build();
常见问题与解决方案
问题现象 | 原因分析 | 解决方案 |
---|---|---|
权限被拒 | Android 13限制后台网络 | 申请POST_NOTIFICATIONS 权限 |
SSL握手失败 | 证书未校验/自签名 | 配置TrustManager 或禁用校验(仅限测试) |
高流量消耗 | 频繁无效请求 | 合并请求+数据压缩 |
后台连接失败 | Doze模式限制 | 使用WorkManager +FOREGROUND_SERVICE |
相关问题与解答
Q1:如何处理Android 13的后台网络限制?
A:需申请POST_NOTIFICATIONS
权限并显示通知:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
NotificationManagerCompat.from(context) .notify(1, new NotificationCompat.Builder(context, CHANNEL_ID) .setContentTitle("网络任务") .setContentText("正在执行后台数据同步") .setSmallIcon(R.drawable.ic_sync) .build());
Q2:如何设置OkHttp的超时参数?
A:通过OkHttpClient.Builder
配置:
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) // 连接超时 .readTimeout(10, TimeUnit.SECONDS) // 读取超时 .writeTimeout(10, TimeUnit.SECONDS) // 写入超时 .build();