MediaScannerService

来源:互联网 发布:工艺流程图软件 编辑:程序博客网 时间:2024/05/07 08:19

http://blog.csdn.net/thl789/article/details/7583365#

本文是笔者的分析归纳,并用UML图(ClassDiagram/Sequence Diagram)来呈现。虽然来源于对Android源码的分析,但文中不会占用大量篇幅罗列源码,所以读者在阅读本文时,手头最好有Android源码,结合源码来解读。本文对MediaScannerService的类结构进行静态分析,对创建时和启动时的工作进行动态分析,分析过程中来看MediaScannerService如何处理MediaScannerReceiver所接收到的各种扫描请求。

 

一、MediaScannerService的静态结构分析

MediaScanner_ClassDiagram

  •  MediaScannerService是一个Service,并实现Runnable,实现工作线程。
  •  MediaScannerService通过ServiceHandler这个Handler把主线程需要大量计算的工作放到工作线程中去做。

在Runnable.run()中执行消息循环,把通过Handler发送过来的消息在工作线程中执行。


二、MediaScannerService的动态分析

        在MediaScannerService被通过startService启动的过程中,其实包含了创建时的工作。下面分别分析创建时和启动时所完成的工作。

2.1 创建之时#0nCreate()

Service对象在被创建的时候,onCreate()会被调用,看一下MediaScannerService的onCreate()里面做了什么:

[java] view plaincopy
  1. PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);  
  2. mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,TAG);  
  3.    
  4. Thread thr = new Thread(nullthis, “MediaScannerService”);  
  5. Thr.start();  

MediaScannerService创建就是为了扫描Media的,这一过程是非常费时费力的。所以:

  •  为了防止在媒体扫描过程中,CPU睡死过去,用PowerManager的WakeLock告诉PowerManager,我这边还在忙,别睡死了[Line#1,2];
  •  在Android的主线程中要快速返回,大量的计算任务交给工作线程去做,这里启了一个工作线程,而这个线程的执行体就是MediaScannerService所实现Runnable的run()方法,用Handler发消息之前,一定要先启动该线程的[Line#4,5]。

2.2 Service启动时#onStartCommand()

        Service对象在被启动的时候,onStartCommand()会被调用,看一下MediaScannerService的onStartCommand()里面做了什么。


        下图是MediaScannerService#onStartCommand()中完成的工作:

MediaScannerService_StartSequence

  •  通过参数startId和intent获得的Bundle,通过mServiceHandler发送到工作线程中去执行[Line#1~5];
  •  ServiceHandler的handleMessage()中,根据传进来不同的“filepath”、“volume”以及“folder”参数,执行不同的扫描工作[Line#6~11];
  •  扫描结束,MediaScannerService本次的使命也就完成,可以stop自身了[Line#12]。


    可以结合MediaScannerReceiver中启动方式的不同来看传入的参数:

  •  如果有“filepath”,是要扫描某个文件,调用scanFile()。扫描单个文件如何实现,在Android MediaScanner:(四)MediaScanner之scanSingleFile中讲解。
  •  否则,无论是针对整个volume还是某个folder的扫描,都可归结为对目录的扫描:对内部volume,扫描”system/media”;对外部volume,扫描整个“/mnt/sdcard”;对含有“folder”参数的,directories[]中只包含“folder”中的路径。

三、小结

        本文对MediaScannerService的类结构进行了静态分析,对创建时和启动时的工作进行了动态分析,分析过程中看MediaScannerService如何响应MediaScannerReceiver所接收到的各种扫描请求。


与其他文章的关系:

  •  向前看MediaScannerReceiver,来自外部的扫描请求,启动MediaScannerService,由Service来具体负责实现;
  •  向后看MediaScanner才是真正的扫描实现,分扫描文件和扫描路径来讲解。


原创粉丝点击