国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
Android中BroadcastReceiver廣播使用及注意點(diǎn)

Android中的廣播用途很廣,是四大組件之一。在android中可以看到它的各種應(yīng)用,從系統(tǒng)發(fā)出的廣播,用戶自定義的廣播等。

這里詳細(xì)記錄下廣播的分類以及使用方法。

廣播,是由兩方面組成一個流程:廣播發(fā)送者、廣播接收者。

有以下場景:

當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時,系統(tǒng)(廣播發(fā)送者)會發(fā)出一條廣播,這條廣播的標(biāo)識是:android.net.conn.CONNECTIVITY_CHANGE。當(dāng)開發(fā)人員(廣播接收者)也添加了這個標(biāo)識,那開發(fā)人員就可以在代碼中接收到這條廣播。廣播接收者可以是多個。


一、廣播的分類,按有無順序區(qū)分,可以分為:標(biāo)準(zhǔn)廣播、有序廣播。

(1)標(biāo)準(zhǔn)廣播。就是多個廣播接收者,接收到廣播是無序的,沒有規(guī)定誰先誰后。按理想狀況來說,是同一時間接收到系統(tǒng)發(fā)出的廣播。

(2)有序廣播。在廣播接收者,注冊添加這條廣播時,有增加了優(yōu)先熟悉的設(shè)置。優(yōu)先級高的先接收,優(yōu)先級高的廣播接收者,還可以控制是否將廣播往下繼續(xù)傳遞;

二、廣播的注冊。

根據(jù)注冊方式不同有靜態(tài)注冊、動態(tài)注冊。下面以接收系統(tǒng)廣播為例:

(1)靜態(tài)注冊:

有兩種方式實現(xiàn):AndroidManifest.xml中注冊+內(nèi)部類;AndroidManifest.xml中注冊+外部類。

這兩種的實現(xiàn)都是在AndroidManifest.xml中注冊,在代碼中寫B(tài)roadCastReceive的重載即可。

以下是,AndroidManifest.xml中注冊+內(nèi)部類:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.broadcasttest_csdn"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="18" />  
  10.   <span style="color:#cc0000;"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></span>  
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="com.example.broadcasttest_csdn.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.   
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.         <receiver android:name="com.example.broadcasttest_csdn.MainActivity$myBroadCast">  
  26.             <intent-filter >  
  27.                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>  
  28.             </intent-filter>  
  29.         </receiver>  
  30.     </application>  
  31.   
  32. </manifest>  

  1. package com.example.broadcasttest_csdn;  
  2.   
  3. import android.net.ConnectivityManager;  
  4. import android.net.NetworkInfo;  
  5. import android.os.Bundle;  
  6. import android.R.anim;  
  7. import android.app.Activity;  
  8. import android.content.BroadcastReceiver;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.content.IntentFilter;  
  12. import android.view.Menu;  
  13. import android.widget.Toast;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.       
  18.     BroadcastReceiver bReceiver;  
  19.     IntentFilter iFilter;  
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.         /*  
  25.         iFilter=new IntentFilter();  
  26.         iFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);  
  27.         bReceiver=new myBroadCast();  
  28.         registerReceiver(bReceiver, iFilter);  
  29.         */  
  30.     }  
  31.     @Override  
  32.     protected void onDestroy() {  
  33.         // TODO Auto-generated method stub  
  34.         super.onDestroy();  
  35.         //unregisterReceiver(bReceiver);  
  36.     }  
  37.   
  38.      public static  class myBroadCast extends BroadcastReceiver  
  39.      {  
  40.         @Override  
  41.         public void onReceive(Context arg0, Intent arg1) {  
  42.             // TODO Auto-generated method stub  
  43.             ConnectivityManager connectivityManager=(ConnectivityManager)arg0.getSystemService(arg0.CONNECTIVITY_SERVICE);  
  44.             NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();  
  45.             if(networkInfo!=null&&networkInfo.isAvailable())  
  46.             {  
  47.                 Toast.makeText(arg0, "網(wǎng)絡(luò)已連接", Toast.LENGTH_SHORT).show();  
  48.             }  
  49.             else {  
  50.                 Toast.makeText(arg0, "網(wǎng)絡(luò)未連接", Toast.LENGTH_SHORT).show();  
  51.             }  
  52.         }  
  53.      }  
  54.       
  55. }  

有幾個要注意的地方:

AndroidManifest.xml區(qū)域:

權(quán)限需要添加,因為我們測試的是網(wǎng)絡(luò)變化(這個系統(tǒng)變化最容易模擬);

receiver中的name不是activity的name,是BroadcastReceiver繼承類的name。如果是內(nèi)部類,則要像上方寫法一樣,用$來得到方法name;

intent-filter中是要過濾下來的廣播,就是你想要接收的廣播標(biāo)識。

代碼紅字標(biāo)識區(qū)域:

廣播接收的內(nèi)部類,需要定義為static。否則會報錯。


那如果我不想把廣播接收類寫為內(nèi)部類,我要寫在外面,方便android工程的其他頁面調(diào)用,可行嗎?

這個也是可以的,我們定義一個獨(dú)立于activity的類,類名我們寫為:BroadReceive。

類的內(nèi)容,如下:

  1. package com.example.broadcasttest_csdn;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.net.ConnectivityManager;  
  7. import android.net.NetworkInfo;  
  8. import android.widget.Toast;  
  9.   
  10. public class BroadReceive extends BroadcastReceiver{  
  11.   
  12.     @Override  
  13.     public void onReceive(Context paramContext, Intent paramIntent) {  
  14.         // TODO Auto-generated method stub  
  15.         ConnectivityManager connectivityManager=(ConnectivityManager)paramContext.getSystemService(paramContext.CONNECTIVITY_SERVICE);  
  16.         NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();  
  17.         if(networkInfo!=null&&networkInfo.isAvailable())  
  18.         {  
  19.             Toast.makeText(paramContext, "網(wǎng)絡(luò)已連接", Toast.LENGTH_SHORT).show();  
  20.         }  
  21.         else {  
  22.             Toast.makeText(paramContext, "網(wǎng)絡(luò)未連接", Toast.LENGTH_SHORT).show();  
  23.         }  
  24.           
  25.       
  26.     }  
  27.   
  28. }  
AndroidManifest.xml的定義如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.broadcasttest_csdn"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="18" />  
  10.    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="com.example.broadcasttest_csdn.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.   
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.         <receiver android:name="com.example.broadcasttest_csdn.BroadReceive">  
  26.             <intent-filter >  
  27.                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>  
  28.             </intent-filter>  
  29.         </receiver>  
  30.     </application>  
  31.   
  32. </manifest>  
與內(nèi)部類方式相比,區(qū)別在上方receive的name,用的是外部類name。
有些同學(xué)還會問,我如果在代碼中,在activity類外,定義一個普通類繼承BroadCastReceiver。能否在AndroidManifest.xml中靜態(tài)注冊。

答案是不行的,你會發(fā)現(xiàn),這里需要static標(biāo)識,而這個類沒辦法加這個static標(biāo)識。


(2)動態(tài)注冊。從上方的靜態(tài)注冊,我們看到還是有挺多要注意的,有的地方也不是很方便靈活。那我們可以考慮用動態(tài)注冊。

動態(tài)注冊,除了權(quán)限外,我們不需要在AndroidManifest.xml中操作其他內(nèi)容,其他的都在代碼中實現(xiàn);

如下:

  1. package com.example.broadcasttest_csdn;  
  2.   
  3. import android.net.ConnectivityManager;  
  4. import android.net.NetworkInfo;  
  5. import android.os.Bundle;  
  6. import android.R.anim;  
  7. import android.app.Activity;  
  8. import android.content.BroadcastReceiver;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.content.IntentFilter;  
  12. import android.view.Menu;  
  13. import android.widget.Toast;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.       
  18.     BroadcastReceiver bReceiver;  
  19.     IntentFilter iFilter;  
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.           
  25.         iFilter=new IntentFilter();  
  26.         iFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);  
  27.         bReceiver=new myBroadCast();  
  28.         registerReceiver(bReceiver, iFilter);  
  29.           
  30.     }  
  31.     @Override  
  32.     protected void onDestroy() {  
  33.         // TODO Auto-generated method stub  
  34.         super.onDestroy();  
  35.         unregisterReceiver(bReceiver);  
  36.     }  
  37.   
  38.      public static  class myBroadCast extends BroadcastReceiver  
  39.      {  
  40.         @Override  
  41.         public void onReceive(Context arg0, Intent arg1) {  
  42.             // TODO Auto-generated method stub  
  43.             ConnectivityManager connectivityManager=(ConnectivityManager)arg0.getSystemService(arg0.CONNECTIVITY_SERVICE);  
  44.             NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();  
  45.             if(networkInfo!=null&&networkInfo.isAvailable())  
  46.             {  
  47.                 Toast.makeText(arg0, "網(wǎng)絡(luò)已連接", Toast.LENGTH_SHORT).show();  
  48.             }  
  49.             else {  
  50.                 Toast.makeText(arg0, "網(wǎng)絡(luò)未連接", Toast.LENGTH_SHORT).show();  
  51.             }  
  52.         }  
  53.      }  
  54.       
  55. }  

AndroidManifest.xml的定義如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.broadcasttest_csdn"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="18" />  
  10.    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="com.example.broadcasttest_csdn.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.   
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.           
  26.     </application>  
  27.   
  28. </manifest>  


如代碼中幾個步驟,定義過濾器intent-filter、定義廣播接收類、在activity開啟的時候綁定二者、在activity銷毀的時候解除綁定。

與靜態(tài)注冊相比,大家應(yīng)該更習(xí)慣用動態(tài)注冊。

二、廣播使用實例

(1)標(biāo)準(zhǔn)廣播。

上方例子中接收系統(tǒng)廣播,都可以算是標(biāo)準(zhǔn)廣播。因為沒有做優(yōu)先級設(shè)置。為了更好的說明,我們發(fā)送自定義廣播,并接收。

  1. package com.example.broadcasttest_csdn;  
  2.   
  3. import android.net.ConnectivityManager;  
  4. import android.net.NetworkInfo;  
  5. import android.os.Bundle;  
  6. import android.R.anim;  
  7. import android.app.Activity;  
  8. import android.content.BroadcastReceiver;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.content.IntentFilter;  
  12. import android.util.Log;  
  13. import android.view.Menu;  
  14. import android.widget.Toast;  
  15.   
  16. public class MainActivity extends Activity {  
  17.   
  18.       
  19.     BroadcastReceiver bReceiver;  
  20.     IntentFilter iFilter;  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_main);  
  25.   
  26.         iFilter=new IntentFilter();  
  27.         iFilter.addAction("myAction");  
  28.         bReceiver=new myBroadCast();  
  29.         registerReceiver(bReceiver, iFilter);  
  30.           
  31.         Intent intent=new Intent();  
  32.         intent.setAction("myAction");  
  33.         intent.putExtra("info", "附帶信息");  
  34.         sendBroadcast(intent);  
  35.           
  36.     }  
  37.     @Override  
  38.     protected void onDestroy() {  
  39.         // TODO Auto-generated method stub  
  40.         super.onDestroy();  
  41.         unregisterReceiver(bReceiver);  
  42.     }  
  43.   
  44.      public static  class myBroadCast extends BroadcastReceiver  
  45.      {  
  46.         @Override  
  47.         public void onReceive(Context arg0, Intent arg1) {  
  48.             // TODO Auto-generated method stub  
  49.             if(arg1!=null)  
  50.             {  
  51.                 Log.i("Action", arg1.getAction()) ;  
  52.                 Log.i("獲取的信息", arg1.getStringExtra("info"));  
  53.             }  
  54.         }  
  55.      }  
  56.       
  57. }  

代碼里沒有做太多的修改。偷懶了,剛啟動就先注冊一個廣播接收,然后直接就發(fā)送廣播。

你在onReceive里,可以收到廣播的信息。Intent我們知道可以附帶一些內(nèi)容的,我也一起傳了個值過去。

(2)有序廣播

  1. package com.example.broadcasttest_csdn;  
  2.   
  3. import android.net.ConnectivityManager;  
  4. import android.net.NetworkInfo;  
  5. import android.os.Bundle;  
  6. import android.R.anim;  
  7. import android.app.Activity;  
  8. import android.content.BroadcastReceiver;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.content.IntentFilter;  
  12. import android.util.Log;  
  13. import android.view.Menu;  
  14. import android.widget.Toast;  
  15.   
  16. public class MainActivity extends Activity {  
  17.   
  18.       
  19.     BroadcastReceiver bReceiver;  
  20.     IntentFilter iFilter;  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_main);  
  25.   
  26.         iFilter=new IntentFilter();  
  27.         iFilter.addAction("myAction");  
  1.        iFilter.setPriority(100);  
  2.         bReceiver=new myBroadCast();  
  3.         registerReceiver(bReceiver, iFilter);  
  4.           
  5.         Intent intent=new Intent();  
  6.         intent.setAction("myAction");  
  7.         intent.putExtra("info", "附帶信息");  
  8.        sendOrderedBroadcast(intent, null);  
  9.           
  10.     }  
  11.     @Override  
  12.     protected void onDestroy() {  
  13.         // TODO Auto-generated method stub  
  14.         super.onDestroy();  
  15.         unregisterReceiver(bReceiver);  
  16.     }  
  17.   
  18.      public static  class myBroadCast extends BroadcastReceiver  
  19.      {  
  20.         @Override  
  21.         public void onReceive(Context arg0, Intent arg1) {  
  22.             // TODO Auto-generated method stub  
  23.             if(arg1!=null)  
  24.             {  
  25.                 Log.i("Action", arg1.getAction()) ;  
  26.                 Log.i("獲取的信息", arg1.getStringExtra("info"));  
  27.                 abortBroadcast();  
  28.             }  
  29.         }  
  30.      }  
  31.       
  32. }  
和以前的代碼相比,唯二的區(qū)別就在發(fā)送廣播和截斷廣播的地方。一個是order、abort,按字面意思就是按順序和截斷。

這樣的廣播,到onReceive中就被截斷了,不會再往下傳遞了。

至于廣播出來后,誰第一個接收,是根據(jù)優(yōu)先級來的。100->99->98....,類似這樣的。

(3)本地廣播

這是剛漏了,補(bǔ)上這個的說明。

本地廣播和以上兩個的區(qū)別在于:本地廣播,只供本應(yīng)用使用,有效的提高廣播的安全性。

寫法與以往的寫法沒有太大的區(qū)別:

  1. package com.example.broadcasttest_csdn;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.content.IntentFilter;  
  9. import android.support.v4.content.LocalBroadcastManager;  
  10. import android.util.Log;  
  11.   
  12. public class MainActivity extends Activity {  
  13.   
  14.     LocalBroadcastManager localBroadcastManager;  
  15.       
  16.     BroadcastReceiver bReceiver;  
  17.     IntentFilter iFilter;  
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.   
  23.         iFilter=new IntentFilter();  
  24.         iFilter.addAction("myAction");  
  25.         iFilter.setPriority(100);  
  26.         bReceiver=new myBroadCast();  
  27.         //registerReceiver(bReceiver, iFilter);  
  28.       localBroadcastManager=LocalBroadcastManager.getInstance(MainActivity.this);  
  29.         localBroadcastManager.registerReceiver(bReceiver, iFilter);  
  30.           
  31.         Intent intent=new Intent();  
  32.         intent.setAction("myAction");  
  33.         intent.putExtra("info", "附帶信息");  
  34.         //sendOrderedBroadcast(intent, null);  
  35.         localBroadcastManager.sendBroadcastSync(intent);  
  36.     }  
  37.     @Override  
  38.     protected void onDestroy() {  
  39.         // TODO Auto-generated method stub  
  40.         super.onDestroy();  
  41.         //unregisterReceiver(bReceiver);  
  42.         localBroadcastManager.unregisterReceiver(bReceiver);  
  43.     }  
  44.   
  45.      public static  class myBroadCast extends BroadcastReceiver  
  46.      {  
  47.         @Override  
  48.         public void onReceive(Context arg0, Intent arg1) {  
  49.             // TODO Auto-generated method stub  
  50.             if(arg1!=null)  
  51.             {  
  52.                 Log.i("Action", arg1.getAction()) ;  
  53.                 Log.i("獲取的信息", arg1.getStringExtra("info"));  
  54.                 //abortBroadcast();  
  55.             }  
  56.         }  
  57.      }  
  58.       
  59. }  
  1.   


將原來的BroadCastReceiver替換,就是修改的地方。將有些定義注釋,用local的定義替換。這就得到我們要的本地廣播。

以上,總結(jié)了我們會遇到的所有廣播形式以及注冊方式,僅供參考。

廣播就到這里。O 。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
編寫安卓無界面后臺程序 開機(jī)自啟動服務(wù)
Android之旅
總結(jié)篇之五:BroadcastReceiver應(yīng)用詳解
android?電話狀態(tài)的監(jiān)聽
android廣播事件機(jī)制及應(yīng)用(實現(xiàn)簡單的定時提醒功能) 轉(zhuǎn)
淺談BroadcastReceiver的用法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服