StorageNotification继承于SystemUI,主要处理Storage事件,比如Storage插拔等。
在StorageNotfication的start函数,会去注册StorageEventListener。
@Override
public void start() {
mNotificationManager = mContext.getSystemService(NotificationManager.class);
mStorageManager = mContext.getSystemService(StorageManager.class);
mStorageManager.registerListener(mListener);
对于U盘或SD卡插拔事件,我们常用的是通过广播的方式去接收,具体可以参考:
http://blog.csdn.net/zhudaozhuan/article/details/7199799
StorageEventListener的实现如下:
private final StorageEventListener mListener = new StorageEventListener() {
@Override
public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
onVolumeStateChangedInternal(vol);
}
@Override
public void onVolumeRecordChanged(VolumeRecord rec) {
// Avoid kicking notifications when getting early metadata before
// mounted. If already mounted, we're being kicked because of a
// nickname or init'ed change.
final VolumeInfo vol = mStorageManager.findVolumeByUuid(rec.getFsUuid());
if (vol != null && vol.isMountedReadable()) {
onVolumeStateChangedInternal(vol);
}
}
@Override
public void onVolumeForgotten(String fsUuid) {
// Stop annoying the user
mNotificationManager.cancelAsUser(fsUuid, PRIVATE_ID, UserHandle.ALL);
}
@Override
public void onDiskScanned(DiskInfo disk, int volumeCount) {
onDiskScannedInternal(disk, volumeCount);
}
};
StorageEventListener中还有其他的call back函数,对于外置存储设备插拔,我觉得这两个函数应该都可以拿到对应的事件:
public void onStorageStateChanged(String path, String oldState, String newState)
public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState)
在StorageNotification使用的是onVolumeStateChanged和onVolumeRecordChanged
private void onVolumeStateChangedInternal(VolumeInfo vol) {
switch (vol.getType()) {
case VolumeInfo.TYPE_PRIVATE:
onPrivateVolumeStateChangedInternal(vol);
break;
case VolumeInfo.TYPE_PUBLIC:
onPublicVolumeStateChangedInternal(vol);
break;
}
}
TYPE_PRIVATE和TYPE_PUBLIC没有详细的解释,对于U盘TYPE_PUBLIC。
private void onPublicVolumeStateChangedInternal(VolumeInfo vol) {
Log.d(TAG, "Notifying about public volume: " + vol.toString());
final Notification notif;
switch (vol.getState()) {
case VolumeInfo.STATE_UNMOUNTED:
notif = onVolumeUnmounted(vol);
break;
case VolumeInfo.STATE_CHECKING:
notif = onVolumeChecking(vol);
break;
case VolumeInfo.STATE_MOUNTED:
case VolumeInfo.STATE_MOUNTED_READ_ONLY:
notif = onVolumeMounted(vol);
showMMDialog();
break;
case VolumeInfo.STATE_FORMATTING:
notif = onVolumeFormatting(vol);
break;
case VolumeInfo.STATE_EJECTING:
notif = onVolumeEjecting(vol);
break;
case VolumeInfo.STATE_UNMOUNTABLE:
notif = onVolumeUnmountable(vol);
break;
case VolumeInfo.STATE_REMOVED:
notif = onVolumeRemoved(vol);
break;
case VolumeInfo.STATE_BAD_REMOVAL:
notif = onVolumeBadRemoval(vol);
break;
default:
notif = null;
break;
}
VolumeInfo记录了外置存储设备的状态,根据不同的状态,进行相应的处理。