而要偵測到系統的通知,就必須先對系統註冊 BroadcastReceiver 事件。
首先,因為要讓程式有機會觸發註冊 BroadcastReceiver 的時機,因此程式還是必須要有個主介面(MainActivity.java)
主介面對應的 XML(activity_main.xml)什麼也沒有,只放了一個按鈕
按鈕按下後會觸發註冊 BroadcaseReceiver 的動作。
而當系統的 Wifi 狀態改變時,程式預期要偵測到,並且在 Log 中顯示偵測到的是 Wifi 已連接還是已關閉。
程式碼如下:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" tools:context=".MainActivity" /> <Button android:id="@+id/enable" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/textView1" android:layout_below="@+id/textView1" android:text="Enable" /> </RelativeLayout>
MainActivity.java
import android.net.wifi.WifiManager; import android.os.Bundle; import android.app.Activity; import android.content.IntentFilter; import android.view.Menu; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button enabledButton = (Button) this.findViewById(R.id.enable); enabledButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { IntentFilter wifiFilter = new IntentFilter(); wifiFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); registerReceiver(new WifiConnectedListener(), wifiFilter); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
WifiConnectedListener.java
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager; import android.util.Log; public class WifiConnectedListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) { Log.e("Wifi", "Wifi is connected"); } else { Log.e("Wifi", "Wifi is lost"); } } } }
這個測試目前的結果發現,註冊 BroadcaseReceiver 之後,的確可以偵測到 Wifi 的狀態
但是存在一個問題是,必須手動啟動程式、按下按鈕後,監聽 BroadcastReceiver 的動作才會開始有作用。
如果是把手機重新啟動時,之前註冊過的 BroadcaseReceiver 會失去作用,必須重新按一次按鈕才行。
預計下一篇要來研究要如何讓程式註冊的事件,永遠都能夠偵測到想偵測的事件。目前猜想也許需要看看 [4] 的討論?
參考資料:
1、Android學習筆記 - 背景執行服務(Service)
2、如何使用BroadcastReceiver
3、Android WIFI How To Detect When WIFI Connection has been established
4、How to Start an Application on Startup?
沒有留言:
張貼留言