慢意向广播

时间:2017-01-14 15:59:21

标签: android android-service android-broadcastreceiver

我正在开发一个使用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。我几乎没有在这个设备上安装/运行任何应用程序,我可以图像将减慢广播速度。另一个有趣的观察是,如果我发送多个广播,它们都会在长时间延迟后同时发送。

提前感谢您的帮助!

0 个答案:

没有答案