我正在开发一个使用Android DownloadManager
下载文件的应用程序。在我的AndroidManifest.xml中,我注册了一个接收器来监听像这样完成的下载
<receiver android:name=".download.DownloadCompleteBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
</intent-filter>
</receiver>
在广播接收器的onReceive
方法中,我启动IntentService
以对下载的文件执行一些后处理,然后才能使用。这是代码的样子:
public class DownloadCompleteBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
final long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1L);
context.startService(
new Intent(context, DownloadService.class)
.putExtra("downloadId", downloadId));
} catch (Throwable t) {
Log.i("Yo", Log.getStackTraceString(t));
}
}
DownloadService类看起来像这样
public class DownloadService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
// Some processing logic
...
// Send processing complete
sendBroadcast(new Intent("com.example.package.DownloadService:PROCESSING_COMPLETE"));
}
}
此服务已在我的AndroidManifest.xml
中注册
<service android:name=".download.DownloadService" android:process=":Downloads"/>
最后,我有一个监听PROCESSING_COMPLETE
广播的活动。该代码看起来像这样
public class MyActivity extends AppCompatActivity {
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Update some UI
}
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(receiver, new IntentFilter("com.example.package.DownloadService:PROCESSING_COMPLETE"));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
}
最后,问题是:
1)我看到下载管理器完成下载和我的注册BroadcastReceiver
收到下载完成通知之间的延迟(多达20秒)。这是正常的吗?这个问题不像下两个问题那么重要。
2)我看到BroadcastReceiver
来电startService()
和DownloadService.onCreate()
被叫之间的延迟(最多2分钟)。这里发生了什么?有时我的设备会显示ANR
对话框,要求我等待应用程序或强行关闭它。我知道我宣布服务是在一个单独的进程中运行的,并且有一些提前时间来创建进程并启动服务,但是我已经看到在已经创建进程的连续运行中出现类似的延迟。将DownloadService
移动到默认进程似乎并没有改善加载时间,但我认为最佳做法是在其自己的进程中运行此类服务,以防止在应用程序崩溃时终止它。
3)我看到DownloadService发送PROCESSING_COMPETE
广播和我的活动实际收到广播之间的延迟(多达2分钟)。这是在没有离开活动然后返回(onPause()
和onResume()
周期),尽管我的代码处理取消注册和重新注册。这里发生了什么?我正在测试运行6.0的Galaxy S7。我几乎没有在这个设备上安装/运行任何应用程序,我可以图像将减慢广播速度。另一个有趣的观察是,如果我发送多个广播,它们都会在长时间延迟后同时发送。
提前感谢您的帮助!