前情提要(Previously)
本系列將使用 Android Studio 將《第一行代碼》(書中講解案例使用Eclipse)刷一遍,旨在為想入坑 Android 開發,並選擇 Android Studio 作為開發 IDE 的同學開路。
PS:其實我就是現學現賣,希望我能堅持刷完。
系列目錄在此:
系統廣播
Android 內置了很多系統級別的廣播,通過監聽這些廣播可以得到相關的系統狀態信息。例如:
- 系統啟動完成
- 打開、關閉飛行模式
- 電量低
- 內存不足
- 網絡變化
動態注冊
下面是監聽網絡變化的例子,新建一個 BroadcastTest 項目。
- 在 MainActivity 中定義一個內部類繼承自 BroadcastingReceiver,代碼如下:
class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show(); } }
- 在 onCreate() 方法中注冊,代碼如下:
private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); }
- 在 onDestroy() 方法中取消注冊,代碼如下:
@Override protected void onDestroy(){ super.onDestroy(); unregisterReceiver(networkChangeReceiver); }
- OK,運行一下,會發現程序啟動時會彈出一個提示;按 Home 回到主界面,並嘗試開關網絡,會發現有提示彈出。
靜態注冊
下面是監聽系統啟動的例子。
- 在 MainActivity 中新建一個 public 類繼承自 BroadcastingReceiver,代碼如下:
public class BootCompleteReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "Boot complete", Toast.LENGTH_SHORT).show(); } }
- 在 AndroidManifest.xml 中靜態注冊,增加 receiver 代碼如下:
<receiver android:name=".MainActivity$BootCompleteReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
- 監聽系統開機廣播需要權限,在 AndroidManifest.xml 中添加權限聲明,代碼如下:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
- OK,運行程序,到設置 → 應用程序里找到我們的 Broadcast,點擊打開會看到程序擁有了開機啟動的權限。重啟機器或模擬器就可以收到開機廣播啦。
自定義廣播
下面是在程序中發送自定義廣播並接收的例子。
- 在 MainActivity 中新建一個 MyBroadcastReceiver,代碼如下:
public static class MyBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); } }
- 在 AndroidManifest.xml 中注冊,代碼如下:
<receiver android:name=".MainActivity$MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST"/> </intent-filter> </receiver>
讓 MyBroadcastReceiver 接收一條 com.example.broadcasttest.MY_BROADCAST
的廣播。
- 給 MainActivity 增加一個按鈕,並在 onCreate() 方法中添加點擊事件,代碼如下:
Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendBroadcast(intent); } });
- OK,運行一下,點擊按鈕,就會收到我們發出的廣播。
本地廣播 LocalBroadcast
前面用到的都是全局廣播,可以被其他任何程序接收到,會引起一些安全性問題。下面是一個發送接收本地廣播的例子。
- 定義一個 LocalReceiver ,代碼如下:
public static class LocalReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show(); } }
- 使用 LocalBroadcastManager 來注冊接收器、發送廣播,代碼如下:
private IntentFilter intentFilter; private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); localBroadcastManager = localBroadcastManager.getInstance(this); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); } }); intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter); }
- 別忘了取消注冊,代碼如下:
@Override protected void onDestroy(){ super.onDestroy(); localBroadcastManager.unregisterReceiver(localReceiver); }
- OK,運行一下,點擊按鈕,就會接收到我們發出的本地廣播啦。
PS:本地廣播無法通過靜態注冊的方式接收。
其它(Miscellaneous)
最近家里事情太多,除我之外的大人小孩都生病了。有大病也有小病,反正就是各種跑醫院,深深的感覺到健康的重要。
附送段子一個:
今天有人問我去過高消費場所么?
我想了想問他:“醫院算么?”
盡管我試圖在本文中盡量完整的進行描述,但受限於篇幅和我的個人水平,本文難免有所遺漏,歡迎在評論中指出。
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!
關於作者(About Me)
本文謝絕轉載,如需轉載需征得作者本人同意,謝謝。