亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1512 | 回復(fù): 0
打印 上一主題 下一主題

通過BroadcastReceiver獲取SDcard,Usb連接和開機事件 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-21 08:41 |只看該作者 |倒序瀏覽
    安裝和卸載SD卡,通過usb和電腦建立或者斷開連接,手機開機這些情況都是系統(tǒng)中比較重要的事件,我們很可能在這些事件發(fā)生的時候需要做某些事情。比如說在手機開機的時候自動運行某個服務(wù),安裝SD卡的時候刪除一些沒有的文件等等。那怎么樣才能獲取到這些事件呢?我們知道在android系統(tǒng)中很多信息的傳輸是通過broadcast來實現(xiàn)的,那么能不能也用BroadCastReceiver來獲取到這些事件呢?答案是肯定的。
    
    1.對于開機事件,可以通過接收Intent.ACTION_BOOT_COMPLETED廣播來獲取。手機在啟動完畢后,會發(fā)出這個廣播,這也是這個廣播唯一的發(fā)送方。但是需要注意的是要接收這個廣播必須在Manifest文件中注冊權(quán)限。

    2.對于安裝和卸載SD卡的事件,可以通過接收Intent.ACTION_MEDIA_MOUNTED和Intent.ACTION_MEDIA_UNMOUNTED廣播來獲取。這個在網(wǎng)上已經(jīng)有不少的相關(guān)文章了,需要注意的就是需要加入DataScheme才能正確地接收廣播。

    3.對于USB的連接事件,我在網(wǎng)上找了找,發(fā)現(xiàn)基本沒有這方面的文章。通過分析USB連接時的log文件,我發(fā)現(xiàn)在這個事件發(fā)生的時候會出來相應(yīng)的log信息,分別是01-09 02:50:07.308: DEBUG/Vold(104): USB disconnected和01-09 02:50:07.589: DEBUG/Vold(104): USB connected。但是在源碼中搜索“Vold”這個關(guān)鍵詞卻并沒有結(jié)果,進入adb shell后使用ps命令查看運行的進程,104號進程是system/bin/vold進程,屬于底層的服務(wù),想要參考這部分代碼的實現(xiàn)恐怕就沒那么容易了。查看了一下Intent的成員中并沒有這方面的內(nèi)容,那這個事件到底要怎么獲取才行呢?最后我發(fā)現(xiàn)原來在android系統(tǒng)中已經(jīng)有了一個USB.java的類,可以處理相關(guān)的事件,但是這個類好像是比較新的SDK才會有。
 
   現(xiàn)在知道如果獲取這些事件了,那實現(xiàn)上就簡單得多了,我實現(xiàn)了一個簡單的例子,可以做一下參考。

   1.首先創(chuàng)建android工程BroadCastReceverTest,包名為com.test。這個工程并不需要創(chuàng)建Activity。

   2.創(chuàng)建新類BootReceiver.java,用于接收手機的啟動廣播。前面已經(jīng)說過了,接收這個廣播需要注冊權(quán)限,具體見Manifest文件。

  1. package com.test;

  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.util.Log;

  6. /**
  7.  * Receiver for receiving boot event. When boot completed, it will start the
  8.  * service for receiving Usb connect and SDcard events.
  9.  *
  10.  */
  11. public class BootReceiver extends BroadcastReceiver {
  12.     private static final String TAG = "BroadCastTest";
  13.     public void onReceive(Context context, Intent intent) {
  14. // Log.d(TAG, intent.getAction());
  15.         if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
  16.             Log.d(TAG, "Received phone Boot Event!");
  17.             Intent mintent=new Intent("com.test.dirStartService");
  18.             Log.d(TAG,"auto startservice");
  19.             context.startService(mintent);
  20.         }
  21.     }

  22. }
     我們可以看到這個類繼承了BroadcastReceiver,在收到Intent.ACTION_BOOT_COMPLETED廣播后會輸出log信息,并啟動一個服務(wù),在這個服務(wù)中將接收SD卡和USB的事件。

    2.創(chuàng)建服務(wù)類dirtStartService.java。在這個服務(wù)中創(chuàng)建了一個BroadcastReceiver,并為其注冊SD卡和USB的事件。在收到這些事件后,會輸出log信息。

  1. package com.test;

  2. import android.app.Service;
  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.IntentFilter;
  7. import android.hardware.Usb;
  8. import android.os.IBinder;
  9. import android.util.Log;

  10. /**
  11.  * Service for receiving Usb connect and SDcard events.
  12.  *
  13.  */

  14. public class dirtStartService extends Service {
  15.     private static final String TAG = "BroadCastTest";

  16.     BroadcastReceiver mReceiver;

  17.     @Override
  18.     public IBinder onBind(Intent intent) {
  19.         return null;
  20.     }

  21.     public void onCreate() {
  22.         super.onCreate();
  23.         Log.d(TAG, "oncreate");
  24.     }

  25.     public void onStart(Intent intent, int startId) {
  26.         Log.d(TAG, "onstart");
  27.         mReceiver = new BroadcastReceiver() {
  28.             public void onReceive(Context context, Intent intent) {
  29. // Log.d(TAG, intent.getAction());
  30.                 if (intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED)) {
  31.                     Log.d(TAG, "Received SDCard Mount Event!");
  32.                 } else if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
  33.                     Log.d(TAG, "Received SDCard UnMount Event!");
  34.                 }else if (intent.getAction().equals(Usb.ACTION_USB_STATE)) {
  35.                     boolean connected = intent.getExtras().getBoolean(Usb.USB_CONNECTED);
  36.                     Log.d(TAG,"Received Usb event, Usb connect status is:"+connected);
  37.                 }
  38.             }
  39.         };
  40.         // Fileter for SDCard mounted and unmounted
  41.         IntentFilter filterSDCard = new IntentFilter();
  42.         filterSDCard.addAction(Intent.ACTION_MEDIA_MOUNTED);
  43.         filterSDCard.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
  44.         // must add so the receiver can receive the SD card mount and unmount
  45.         // event
  46.         filterSDCard.addDataScheme("file");
  47.         registerReceiver(mReceiver, filterSDCard);

  48.         //Filter for usb connect
  49.         IntentFilter filter = new IntentFilter();
  50.         filter.addAction(Usb.ACTION_USB_STATE);
  51.         registerReceiver(mReceiver, filter);

  52.     }
  53. }
    3. 此外就是Manifest文件,對于手機啟動的廣播也是在Manifest文件中注冊的。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     package="com.test"
  5.     android:versionCode="1"
  6.     android:versionName="1.0">
  7.     <application
  8.         android:icon="@drawable/icon"
  9.         android:label="@string/app_name">

  10.         <service
  11.             android:enabled="true"
  12.             android:name=".dirtStartService">
  13.             <intent-filter>
  14.                 <action
  15.                     android:name="com.test.dirStartService"></action>
  16.             </intent-filter>
  17.         </service>

  18.         <receiver
  19.             android:name="com.test.BootReceiver">
  20.             <intent-filter>
  21.                 <action
  22.                     android:name="android.intent.action.BOOT_COMPLETED">
  23.                 </action>
  24.                 <category
  25.                     android:name="android.intent.category.HOME">
  26.                 </category>
  27.             </intent-filter>
  28.         </receiver>
  29.     </application>
  30.     <uses-sdk
  31.         android:minSdkVersion="7" />
  32. </manifest>
    需要注意的是USB.java類是不包含在android.jar中的,需要為工程引入外部包framework.jar才能正確運行程序。

    對于程序的運行要首先將程序安裝到手機上,然后重新啟動手機,重啟后程序會收到的啟動事件并啟動服務(wù),這個時候如果進行USB的連接和斷開以及SD卡的加載和卸載操作服務(wù)都會收到廣播,并輸出log信息。輸出的信息如下圖所示:

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP