我正在尝试使用BroadcastReceiver来检测手机何时从WiFi接入点断开连接.为此,我在清单中注册了我的BroadcastReceiver:
<receiver android:name="com.eshayne.android.WiFiBroadcastReceiver">
<intent-filter>
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
在我的WiFiBroadcastReceiver类中,我正在检查NETWORK_STATE_CHANGED_ACTION操作并查看NetworkInfo的详细状态:
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo info = (NetworkInfo)intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
android.util.Log.d("com.eshayne.android.WiFiBroadcastReceiver", "network state change - detailedState=" + info.getDetailedState() + ": " + info.toString());
if (info.getDetailedState() == DetailedState.DISCONNECTED) {
...
}
else if (info.getDetailedState() == DetailedState.CONNECTED) {
...
}
Run Code Online (Sandbox Code Playgroud)
我看到的问题是,当手机离开WiFi接入点的范围时,我的"断开连接"回叫会在停止前被调用6次 - 大约每15秒一次.到目前为止,我还没有找到每个回调的NetworkInfo之间的任何区别特征.写入日志的每个NetworkInfo对象如下所示:
02-18 10:16:51.918 D/com.eshayne.android.WiFiBroadcastReceiver( 1511): network state change - detailedState=DISCONNECTED: NetworkInfo: type: WIFI[], state: DISCONNECTED/DISCONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true
Run Code Online (Sandbox Code Playgroud)
这也不是电话在WiFi范围内进出的问题,因为在"断开连接"的回调之间没有调用我的"连接"回调.任何其他国家也不会在其间被触发.只是一系列快速的6个回调,每个回调都有详细的DISCONNECTED状态.
有没有更好的方法来检测手机何时丢失了WiFi连接,以便每次断开连接只调用一次我的回叫?或者以任何方式检测我看到的6个回调中的哪一个是"最终"回调?
我想编写一个在日历提醒发生时触发的应用程序.我意识到没有正式记录这样做的方法,但我在日志中看到当我的日历闹钟在我的手机(Droid X)上消失时,AlertReceiver表示它已收到android.intent.action.EVENT_REMINDER:
01-03 11:03:00.029 D 1523 AlertReceiver onReceive: a=android.intent.action.EVENT_REMINDER Intent { act=android.intent.action.EVENT_REMINDER dat=content://com.android.calendar/129407058000 flg=0x4 cmp=com.android.calendar/.AlertReceiver (has extras) }
Run Code Online (Sandbox Code Playgroud)
所以,我设置了一个简单的BroadcastReceiver:
package com.eshayne.android;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class CalendarTest extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
android.util.Log.i("CalendarTest", "CalendarTest.onReceive called!");
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.eshayne.android"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.READ_CALENDAR" />
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<receiver android:name="com.eshayne.android.CalendarTest">
<intent-filter>
<action android:name="android.intent.action.EVENT_REMINDER" />
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="8" />
</manifest>
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我把它放在手机上并设置一个带有提醒的日历活动时 - 当提醒提醒时,我仍然会看到AlertReceiver日志条目,但不是我的.
我还在这里阅读了一些需要通过代码而不是清单注册的系统意图.所以,我尝试了以下代码:
package …
Run Code Online (Sandbox Code Playgroud)