Chinaunix首页 | 论坛 | 博客
  • 博客访问: 274430
  • 博文数量: 74
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-09 17:34
文章分类

全部博文(74)

文章存档

2017年(1)

2016年(13)

2015年(24)

2014年(9)

2013年(27)

我的朋友

分类: Android平台

2013-05-21 15:07:19

轉自:http://blog.csdn.net/muojie/article/details/8315666

“USB连接方式”设置界面

选择MTP,PTP,UMS的选项界面就定义在UsbSettings.java,选择其中一个选项时会执行以下代码。

packages/apps/Settings/src/com/android/settings/deviceinfo/UsbSettings.java


  1. if (preference == mMtp) {            
  2.     mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP, true);  
  3.     updateToggles(UsbManager.USB_FUNCTION_MTP);  
  4. else if (preference == mPtp) {     
  5.     mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_PTP, true);  
  6.     updateToggles(UsbManager.USB_FUNCTION_PTP);  
  7. else if(preference == mUms) {      
  8.     mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MASS_STORAGE, true);  
  9.     updateToggles(UsbManager.USB_FUNCTION_MASS_STORAGE);  
  10. }  

updateToggle就是去让执行某些选项的选中与取消工作。

其中最重要的是mUsbManager.setCurrentFunction(),mUsbManger是这样得到的:


  1. @Override  
  2. public void onCreate(Bundle icicle) {  
  3.     super.onCreate(icicle);  
  4.     mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);  
  5. }     

它的实现在frameworks/base/core/java/android/hardware/usb/UsbManager.java。


它的接口实现在frameworks/base/core/java/android/hardware/usb/IUsbManager.aidl

frameworks/base/services/java/com/android/server/usb/UsbService.java


  1. /**     
  2.  * UsbService manages all USB related state, including both host and device support. 
  3.  * Host related events and calls are delegated to UsbHostManager, and device related 
  4.  * support is delegated to UsbDeviceManager. 
  5.  */      
  6. public class UsbService extends IUsbManager.Stub {  
  7.     private final Context mContext;  
  8.     private UsbDeviceManager mDeviceManager;  
  9.     private UsbHostManager mHostManager;  
  10.     private final UsbSettingsManager mSettingsManager;  


这个界面就是"com.android.settings.UsbSettings" Activity。在frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java中被调用。

如果你选择了USB调试功能,还会弹出"com.android.settings.DevelopmentSettings" Activity,也是在UsbDeviceManager.java中被调用。关于UsbDevcieManager,我们以后再细看。

如果你选择了UMS,还会弹出"com.android.systemui.usb.UsbStorageActivity" Activity,就是“打开USB存储设备”的界面。它就义在定义在:
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbStorageActivity.java。

这些界面只有在插入USB时才会有通知显示。在没有插USB的情况下,有些界面是没有入口的。我们就以UsbStorageActivity为例,介绍一下这些通知是怎么弹出来的。

通知是怎么弹出来的

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java


  1. // storage  
  2. mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);  
  3. mStorageManager.registerListener(  
  4.         new com.android.systemui.usb.StorageNotification(context));  
这里注册了监听函数com.android.systemui.usb.StorageNotification,这个只是针对Phone,对于平板,有tablet/TabletStatusBarPolicy.java

我们来看一下注册的com.android.systemui.usb.StorageNotification

frameworks/base/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java


  1. public class StorageNotification extends StorageEventListener {   
  2.     private static final String TAG = "StorageNotification";  
  3.   
  4.     public StorageNotification(Context context) {  
  5.         mContext = context;  
  6.   
  7.         mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);  
  8.         final boolean connected = mStorageManager.isUsbMassStorageConnected();  
  9.         Slog.d(TAG, String.format( "Startup with UMS connection %s (media state %s)", mUmsAvailable,  
  10.                 Environment.getExternalStorageState()));  
  11.           
  12.         HandlerThread thr = new HandlerThread("SystemUI StorageNotification");  
  13.         thr.start();  
  14.         mAsyncEventHandler = new Handler(thr.getLooper());  
  15.   
  16.         onUsbMassStorageConnectionChanged(connected);  
  17.     }  

在构造函数里就调用了onUsbMassStorageConnectionChanged函数,它最终会调到updateUsbMassStorageNotification(),


  1. /**  
  2.  * Update the state of the USB mass storage notification 
  3.  */  
  4. void updateUsbMassStorageNotification(boolean available) {  
  5.   
  6.     if (available) {  
  7.         Intent intent = new Intent();  
  8.         intent.setClass(mContext, com.android.systemui.usb.UsbStorageActivity.class);  
  9.         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  10.   
  11.         PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0);   
  12.         setUsbStorageNotification(  
  13.                 com.android.internal.R.string.usb_storage_notification_title,  
  14.                 com.android.internal.R.string.usb_storage_notification_message,  
  15.                 com.android.internal.R.drawable.stat_sys_data_usb,  
  16.                 falsetrue, pi);  
  17.     } else {  
  18.         setUsbStorageNotification(000falsefalsenull);  
  19.     }     
  20. }     

也就是说UsbStorageActivity和StorageNotification绑定在了一起,什么时候弹出这个通知,就可以进入这个Activity了。

如果连接了USB,就会在通知栏里显示USB选项的通知。如果没有连接,就会把这个通知给取消掉。那我们看一下,这个通知是怎么弹出来的。

StorageManager

frameworks/base/core/java/android/os/storage/StorageManager.java


  1. public void registerListener(StorageEventListener listener) {  
  2.     if (listener == null) {              
  3.         return;  
  4.     }  
  5.   
  6.     synchronized (mListeners) {          
  7.         mListeners.add(new ListenerDelegate(listener));  
  8.     }  
  9. }    
mListeners会被私有成员MountServiceBinderListener用到,而MountServiceBinderListener又是继承自IMountServiceListener.Stub,在构造函数里被注册。


  1. public StorageManager(Looper tgtLooper) throws RemoteException {  
  2.     mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));  
  3.     if (mMountService == null) {  
  4.         Log.e(TAG, "Unable to connect to mount service! - is it running yet?");  
  5.         return;  
  6.     }  
  7.     mTgtLooper = tgtLooper;  
  8.     mBinderListener = new MountServiceBinderListener();  
  9.     mMountService.registerListener(mBinderListener);  
  10. }  
所以关键还是在mMountService。
阅读(2963) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~