Android:日常學習筆記(9)———探究廣播機制
阿新 • • 發佈:2017-05-23
ora rri enabled cas 管理 encoding protect 其他 acc
Android:日常學習筆記(9)———探究廣播機制
引入廣播機制
Andorid廣播機制
廣播是任何應用均可接收的消息。系統將針對系統事件(例如:系統啟動或設備開始充電時)傳遞各種廣播。通過將 Intent
傳遞給 sendBroadcast()
、sendOrderedBroadcast()
或 sendStickyBroadcast()
,您可以將廣播傳遞給其他應用。
Android提供了一套完整的API,允許應用程序自由地發送和接受廣播。發送廣播使用Intent,接受廣播使用 廣播接收器(Boradcast Receiver)。
廣播分成兩種類型:
- 標準廣播:一種完全異步的廣播,在廣播發出之後,所有的廣播接收器幾乎同時收到這條廣播信息。
- 有序廣播:一種同步執行的廣播,在廣播發出之後,所有的接收器根據先後順序依次收到,並且可以被截獲。
接受系統廣播
廣播接收器可以自由地對自己感興趣的廣播進行註冊,這樣當相應的廣播發出時,廣播接收器就可以收到這條廣播,並在內部處理邏輯。
動態註冊:在代碼中註冊
創建廣播接收器的步驟:
1.新建一個類使其繼承BroadcastReceiver
2.重寫onReceive()方法
public class MyBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"network changes",Toast.LENGTH_LONG).show(); } }3.為接受器綁定要接受的廣播
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; /* Structured description of Intent values to be matched. An IntentFilter can match against actions, categories, and data (either via its type, scheme, and/or path) in an Intent. It also includes a "priority" value which is used to order multiple matching filters.*/ private MyBroadCastReceiver myReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //需要廣播器接受什麽樣的廣播,就在這裏添加什麽樣的action myReceiver = new MyBroadCastReceiver(); registerReceiver(myReceiver,intentFilter); //註冊 } @Override protected void onDestroy() { unregisterReceiver(myReceiver); //動態註冊的廣播一定要取消註冊才行 super.onDestroy(); }
獲取精確的網絡狀態:
1.修改接收器代碼
public class MyBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //這是一個系統服務類,專門用於管理網絡連接 NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if(networkInfo!=null&&networkInfo.isAvailable()) { Toast.makeText(context,"獲得網絡連接",Toast.LENGTH_LONG).show(); } else { Toast.makeText(context,"失去網絡連接",Toast.LENGTH_LONG).show(); } } }3.聲明程序權限
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.zy.dealhelper"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application ..... </application> </manifest>
說明:涉及用戶隱私的狀態信息必須要到AndroidManifest.xml中進行聲明
靜態註冊:在AndroidManifest.xml中進行聲明
說明:靜態註冊最大的特點就是程序未啟用的情況下便可接受到廣播。
使用AS自動生成廣播接收器
1.新建一個廣播接收器
2.配置廣播接收器
public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show(); } }3.手動註冊
發送自定義廣播
發送標準廣播
1.首先定義了自己的廣播接收器並且配置了廣播名
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到我自己發送的廣播"+intent.getExtras().getString("info"),Toast.LENGTH_SHORT).show();
} }
<receiver android:name=".broadcast.MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.expample.zy.MY_BROADCAST"></action> </intent-filter> </receiver>
2.發送廣播
Intent broadCastIntent = new Intent("com.example.zy.MY_BROADCAST"); broadCastIntent.putExtra("info","你好啊"); sendBroadcast(broadCastIntent);
發送有序廣播
0.設置接收器的優先等級
<intent-filter android:priority="100">
<action android:name="com.example.zy.MY_BROADCAST"></action>
</intent-filter>
1.發送有序廣播
sendOrderedBroadcast(intent,null);
2.截獲
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到我自己發送的廣播"+intent.getExtras().getString("info"),Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
使用本地廣播
為什麽使用本地廣播?
前面我們接收和發送的廣播全部屬於系統全局廣播,即發出的廣播可以被其他任何應用程序接收到,並且我們也可以接收到來自其他應用程序的廣播,這樣就容易引起安全性問題。為此Android引入了一套本地廣播機制,使用這個機制發出的廣播僅僅能在應用程序內部進行傳遞。
實例
public class MainActivity extends AppCompatActivity { private LocalBroadcastManager localBroadcastManager; private IntentFilter intentFilter; private MyBroadCastReceiver myReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); localBroadcastManager = LocalBroadcastManager.getInstance(this); //1.獲取本地管理器實例 setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); myReceiver = new MyBroadCastReceiver(); localBroadcastManager.registerReceiver(myReceiver,intentFilter); //2.使用本地廣播管理器進行動態註冊 }); } @Override protected void onDestroy() { localBroadcastManager.unregisterReceiver(myReceiver); //3.使用本地廣播管理器動態卸載 super.onDestroy(); } }
Android:日常學習筆記(9)———探究廣播機制