Android Studio 單刷《第一行代碼》系列 07 —— Broadcast 廣播


前情提要(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)

addict

本文謝絕轉載,如需轉載需征得作者本人同意,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM