Android學習筆記(五)廣播(Broadcast)


5. 廣播

5.1 廣播

Android中的廣播主要分為兩種類型:標准廣播有序廣播 標准廣播:         是一種完全異步執行的廣播,廣播發出后,所有的廣播接收器都會在同一時間內接受這條廣播信息,無先后順序,效率較高,也意味着無法被截斷。

有序廣播:         則是同步執行的廣播,廣播發出后,同一時刻只有一個廣播接收器能收到,當此廣播接收器邏輯執行完畢后,廣播才會繼續傳遞,有先后順序,效率低,可被截斷


5.2 接收系統廣播

5.2.1 動態注冊監聽網絡變化

廣播接收器可自由選擇自己要注冊監聽的廣播,注冊監聽廣播有兩種方式,在代碼中注冊(動態注冊)和在AndroidManifest.xml中注冊(靜態注冊)。 1.創建廣播接收器的步驟: (1)新建一個類,繼承自BroadcastReceiver (2)重寫父類的onReceive()方法。 經驗:         實際項目中,不要在onReceive()方法中添加過多的邏輯或耗時的操作,因為在廣播接收器中是不允許開啟線程的,當此方法允許較長時間而沒結束時,程序就會報錯,因此廣播接收器更多的是扮演一種打開程序其他組件的角色,比如創建狀態欄通知。 2.動態注冊監聽網絡變化例子
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;

private NetworkChangeReceiver networkChangeReceiver;

/**
* 1.定義了一個內部類,繼承自BroadcastReceiver類,重寫接收到廣播后的執行方法
*/
class NetworkChangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "network changes!", Toast.LENGTH_SHORT).show();
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

/**
* 2.創建一個IntentFilter類實例,添加一個值為如下的action(因為當系統網絡發生變化時發出的就是此值的廣播)
*/
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
/**
* 3.創建一個自定義廣播接收器類實例,然后調用registerReceiver進行注冊。
*/
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
}

@Override
protected void onDestroy() {
super.onDestroy();
/**
* 4.動態注冊的廣播接收器最后都要取消注冊,不管是在哪個方法中
*/
unregisterReceiver(networkChangeReceiver);
}
}
優化效果,實現提示當前網絡是否可用:
@Override
public void onReceive(Context context, Intent intent) {
//首先通過getSystemService()方法得到ConnectivityManager的實例,這是系統服務類,專門用於管理網絡連接
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//然后通過它的getActiveNetworkInfo()方法得到NetworkInfo實例
NetworkInfo network = connectivityManager.getActiveNetworkInfo();
//最后判斷是否有網絡
if (network != null && network.isAvailable()) {
Toast.makeText(context, "網絡可用", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "網絡不可用", Toast.LENGTH_SHORT).show();
}
}
注意:         Android 系統為了保證應用程序的安全性做了規定,如果程序需要訪問一些系統的關鍵性信息,必須在配置文件中聲明權限才可以,否則程序將會直接崩潰,比如這里查詢系統的網絡狀態就是需要聲明權限的。
打開AndroidManifest.xml,加入以下聲明(在manifest節點下):
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

5.2.2 靜態注冊實現開機啟動

動態注冊有自由靈活的優勢,但也有缺點,即必須要在程序啟動后才能接收廣播。 實現開機后程序自動啟動: (1)新建一個廣播接收器類,繼承BroadcastReceiver類,重寫onReceive()方法。 (2)修改AndroidManifest.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jastar.broadcasttest">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--通過receiver標簽來靜態注冊廣播接收器-->
<receiver android:name=".receiver.BootCompleteReceiver">
<intent-filter>
<!--在此添加要監聽的廣播action-->
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>

</manifest>

5.3 發送自定義廣播

5.3.1 發送標准廣播

Intent intent=new Intent("com.jastar.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

5.3.2 發送有序廣播

Intent intent = new Intent("com.jastar.broadcasttest.MY_BROADCAST");
//第一個參數為intent,第二個參數為與權限有關的字符串
sendOrderedBroadcast(intent, null);

在AndroidManifest.xml中配置優先級:

終止廣播繼續傳遞可在onReceive()方法中添加以下代碼: abortBroadcast();

5.4 本地廣播

1.系統全局廣播可被其他任何的應用程序接收到,而本地廣播則只能傳遞在應用程序的內部,從而保證安全問題
2.本地廣播並不復雜,通過LocalBroadcastManager來管理,具體用法跟動態注冊廣播和接收是類似的 (1)獲取LocalBroadcastManager實例 LocalBroadcastManager localManager = LocalBroadcastManager.getInstance(this); (2)發送本地廣播 localManager.sendBroadcast(intent); //有序廣播 localManager.sendBroadcastSync(intent); (3)注冊接收廣播 //參數1為監聽類,參數2為IntentFilter localManager.registerReceiver(localReceiver,intentFilter); //取消注冊 localManager.unregisterReceiver(localReceiver);
3.本地廣播的優勢 (1)廣播只在應用程序內,不用擔心機密數據泄露 (2)其他程序無法將廣播發送到我們程序內部,不需要擔心安全漏洞的隱患 (3)比發送全局廣播更高效





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com