下载时会启动MediaScannerService进行扫描下载的文件。
启动MediaScannerService的代码位于以下文件:
packages\providers\downloadprovider\src\com\android\providers\downloads\DownloadService.java
private void bindMediaScanner() { if (!mMediaScannerConnecting) { Intent intent = new Intent(); intent.setClassName("com.android.providers.media", "com.android.providers.media.MediaScannerService"); mMediaScannerConnecting = true; bindService(intent, mMediaScannerConnection, BIND_AUTO_CREATE); // 启动MediaScannerService对下载的文件进行扫描 } }
1.启动媒体扫描服务MediaScannerService
对bindMediaScanner函数的调用在本文件的UpdateThread类的run函数中。
UpdateThread类的对象在updateFromProvider函数中被创建。
而调用updateFromProvider函数的地方有4处,包括:
(1)DownloadManagerContentObserver类的onChange函数中
(2)MediaScannerConnection类的onServiceConnected,onCreate和onStartCommand函数中
2.执行文件扫描
在scanFile函数中执行了IMediaScannerService的requestScanFile函数,对文件进行扫描。
扫描完成后,更新数据库,根据scanFile的参数设置为“已经扫描”;或者从MediaProvider数据库和Downloads数据库中删除此记录,并删除此文件。
scanFile函数是在deleteDownload函数中UpdateThread类的run函数中被调用的。