前情提要(Previously)
本系列將使用 Android Studio 將《第一行代碼》(書中講解案例使用Eclipse)刷一遍,旨在為想入坑 Android 開發(fā),并選擇 Android Studio 作為開發(fā) IDE 的同學開路。
PS:其實我就是現(xiàn)學現(xiàn)賣,希望我能堅持刷完。
系列目錄在此:
- Android Studio 單刷《第一行代碼》系列目錄
系統(tǒng)廣播
Android 內(nèi)置了很多系統(tǒng)級別的廣播,通過監(jiān)聽這些廣播可以得到相關(guān)的系統(tǒng)狀態(tài)信息。例如:
- 系統(tǒng)啟動完成
- 打開、關(guān)閉飛行模式
- 電量低
- 內(nèi)存不足
- 網(wǎng)絡(luò)變化
動態(tài)注冊
下面是監(jiān)聽網(wǎng)絡(luò)變化的例子,新建一個 BroadcastTest 項目。
- 在 MainActivity 中定義一個內(nèi)部類繼承自 BroadcastingReceiver,代碼如下:
class NetworkChangeReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();}
}
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,運行一下,會發(fā)現(xiàn)程序啟動時會彈出一個提示;按 Home 回到主界面,并嘗試開關(guān)網(wǎng)絡(luò),會發(fā)現(xiàn)有提示彈出。
靜態(tài)注冊
下面是監(jiān)聽系統(tǒng)啟動的例子。
- 在 MainActivity 中新建一個 public 類繼承自 BroadcastingReceiver,代碼如下:
public class BootCompleteReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){Toast.makeText(context, "Boot complete", Toast.LENGTH_SHORT).show();}
}
- 在 AndroidManifest.xml 中靜態(tài)注冊,增加 receiver 代碼如下:
<receiver android:name=".MainActivity$BootCompleteReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter>
</receiver>
- 監(jiān)聽系統(tǒng)開機廣播需要權(quán)限,在 AndroidManifest.xml 中添加權(quán)限聲明,代碼如下:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
- OK,運行程序,到設(shè)置 → 應(yīng)用程序里找到我們的 Broadcast,點擊打開會看到程序擁有了開機啟動的權(quán)限。重啟機器或模擬器就可以收到開機廣播啦。
自定義廣播
下面是在程序中發(fā)送自定義廣播并接收的例子。
- 在 MainActivity 中新建一個 MyBroadcastReceiver,代碼如下:
public static class MyBroadcastReceiver extends BroadcastReceiver{@Overridepublic 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() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");sendBroadcast(intent);}
});
- OK,運行一下,點擊按鈕,就會收到我們發(fā)出的廣播。
本地廣播 LocalBroadcast
前面用到的都是全局廣播,可以被其他任何程序接收到,會引起一些安全性問題。下面是一個發(fā)送接收本地廣播的例子。
- 定義一個 LocalReceiver ,代碼如下:
public static class LocalReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();}
}
- 使用 LocalBroadcastManager 來注冊接收器、發(fā)送廣播,代碼如下:
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() {@Overridepublic 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,運行一下,點擊按鈕,就會接收到我們發(fā)出的本地廣播啦。
PS:本地廣播無法通過靜態(tài)注冊的方式接收。
?
盡管我試圖在本文中盡量完整的進行描述,但受限于篇幅和我的個人水平,本文難免有所遺漏,歡迎在評論中指出。
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!
關(guān)于作者(About Me)
addict
from:?https://www.cnblogs.com/DebugLife/p/4391160.html
總結(jié)
以上是生活随笔為你收集整理的Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。