前言
1.1 在上節課我們講了在項目定義檔案AndroidManifest.xml中註冊BroadcastReceiver廣播接收器的方法,今天我們介紹在代碼中註冊BroadcastReceiver廣播接收器的方法。在項目定義檔案AndroidManifest.xml中註冊BroadcastReceiver廣播接收器的話,即使你的應用程式已經被關閉了,這個BroadcastReceiver廣播接收器依然會接收到廣播,比如:你的這個應用程式是監聽拍照事件,每次拍照後BroadcastReceiver廣播接收器接收到後會彈出一個提示框“您已拍了圖片,圖片已儲存”,當你開著這個應用程式是能收到廣播的這是沒有問題的,但是你把這個應用程式關閉掉了依然能收到廣播,依然要彈出“您已拍了圖片,圖片已儲存”,這在有的情境中不是我們需要的了,所以我們要換一種註冊BroadcastReceiver廣播接收器的方法。
1.2 瞭解安卓系統當中出現什麼情況的時候會發出廣播,以便我們對安卓作業系統當中的事件進行控制,所以我們要瞭解Android內建的這些BroadcastReceiver Actions。這裡我就不再寫了,可以去參考Android SDK 裡面很全而且都有說明。
思路
BroadcastReceive用於監聽被廣播的事件,這種事件是以Intent對象廣播出來的,所以必須在我們的安卓系統中註冊BroadcastReceive類。今天我們介紹在代碼中註冊BroadcastReceiver廣播接收器的方法。
實現步驟
一:布局檔案編寫
1.1:布局檔案main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="綁定廣播接收器"
android:id="@+id/start"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消綁定的廣播接收器"
android:id="@+id/end"
/>
</LinearLayout>
二:代碼檔案編寫
2. 1:MainActivity.java
package com.menglin.broadcastreceiver;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity
{
protected static final String SMS_Action = "android.provider.Telephony.SMS_RECEIVED";
//聲明兩個Button對象
private Buttonbtn_start,btn_end;
//聲明一個我們自訂的BroadcastReceiver類的對象
BroadcastReceiver br;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//載入布局檔案main.xml
setContentView(R.layout.main);
//通過findViewById()方法得到兩個按鈕對象
btn_start= (Button)findViewById(R.id.start);
btn_end= (Button)findViewById(R.id.end);
//給兩個按鈕綁定監聽單擊事件
btn_start.setOnClickListener(btn_start_listener);
btn_end.setOnClickListener(cannellistener);
}
//監聽單擊事件
private OnClickListener btn_start_listener= new OnClickListener()
{
@Override
public void onClick(View v)
{
//建立一個BroadcastReceiver對象
br = new BroadcastReceiver();
//建立一個IntentFilter對象
IntentFilter intentfilter = new IntentFilter();
//為IntentFilter對象添加Action,也相當於在AndroidManifest.xml定義一樣,定義的目的是過濾器只許當安卓的作業系統產生短訊息的事件咱們自訂的這個BroadcastReceiver類才能來接收短訊息這個廣播,我們才能進行代碼的進一步處理
intentfilter.addAction(SMS_Action);
//註冊廣播接收器
registerReceiver(br, intentfilter);
}
};
//監聽單擊事件
private OnClickListener btn_end_listener= new OnClickListener()
{
@Override
public void onClick(View v)
{
//取消註冊的廣播接收器
unregisterReceiver(br);
}
};
}
2.2 BroadcastReceiver .java
package com.menglin.broadcastreceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BroadcastReceiver extends android.content.BroadcastReceiver
{
private static final String Tag = "BroadcastReceiver";
//建構函式
public BroadcastReceiver()
{
Log.i(Tag, "建構函式");
}
@Override
public void onReceive(Context context, Intent intent)
{
Log.i(Tag, "已接收");
}
}
三:項目定義檔案
AndroidMainfest.xml
在<appliacation/>節點下面加上具有接收簡訊的許可權節點<uses-permission android:name="android.permission.RECEIVE_SMS"/>,我之前寫成<uses-permission android:name="android.permission.SMS_RECEIVE"/>,系統總是提醒我permission denial: receiving intent{act=intent
android.provider.Telephony.SMS_RECEIVED},我還是總是納悶了,怎麼回事,不是許可權加上了嗎,最後查看SDK發現是兩單詞寫反了。
執行流程
但我們單擊“註冊廣播接收器”按鈕後,我們通過“Emulator Control“面板給模擬器發送個短訊息,此時我們的Log日誌會輸出“已接收”,這個“已接收”就是我們在我們自訂的廣播接收器類中輸出的,我們再次單擊“取消廣播接收器”按鈕後,我們再次通過“Emulator Control”面板給模擬器發送個短訊息,Log日誌就輸不出了“已接收”了。
運行機制
當我們把這個我們寫好的廣播接收器類註冊到Android的作業系統上面後,當系統接收到短訊息後,就會自動調用我們寫的這個BroadcastReceiver.java類中的onReceive()方法,當onReceive()方法中的代碼處理完畢以後,這個廣播接收器對象的生命就銷毀了。當系統拍照或者收到電話等事件的廣播不會調用我們寫的BroadcastReceiver.java類中的onReceive()方法,因為我們寫過intentfilter.addAction(SMS_Action);這行代碼的意思是我們的廣播接收器只對當系統接收到短訊息會產生興趣,不對系統的其他事件的廣播感興趣。
運行效果如下