我想把BoradcastReceiverListerner
- 以前嵌套在MainActivity
并在那里工作得很好 - 在一个单独的课程中,因为我的MainActivity
已经非常大了。在onReceive()
中我需要调用方法deliverBestAccessPoint()
和textWifi()
所以我决定使用Parcelable
接口来执行此操作,因为传递的数据是ScanResult
但是我我遇到的问题是,应用程序会在一秒钟后自动重启并且会自动定期播放wifi scanResult吗?
BroadcastReceiverListener类:
public class BroadcastReceiverListener extends BroadcastReceiver implements Parcelable {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(
android.net.wifi.WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
WifiManager wifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
final List<ScanResult> results = wifiManager.getScanResults();
if (results != null) {
ArrayList<ScanResult> updatedResults = new ArrayList<ScanResult>();
for (int i = 0; i < results.size(); i++) {
String ssid = results.get(i).SSID;
if (ssid.startsWith("KD")) {
updatedResults.add(results.get(i));
}
}
Intent updateIntenet = new Intent(context, MainActivity.class);
updateIntenet.putParcelableArrayListExtra("broadcast_event",
updatedResults);
context.startActivity(updateIntenet);
}
}
else if (intent.getAction().equals(
android.net.ConnectivityManager.CONNECTIVITY_ACTION)) {
}
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
}
MainActivity中的onNewIntent方法:
@Override
protected void onNewIntent(Intent intent) {
String intentResult = intent.getStringExtra("broadcast_event");
if (intentResult != null) {
List<ScanResult> results = intent.getParcelableArrayListExtra("broadcast_event");
String a = deliverBestAccessPoint(results);
textWifi.setText(a.toString());
} else {
textWifi.setText("No route is available.");
}
}
清单:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- <receiver android:name=".BroadcastReceiverListener" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.SCAN_RESULTS" />
</intent-filter>
</receiver> -->
</application>
答案 0 :(得分:1)
很难说为什么您的应用会重新启动,但我可以看到一个阻止textWifi
填充的问题。
当您实际上是intent.getStringExtra("broadcast_event")
时,您正在呼叫ParcelableArrayListExtra
。
一个简单的解决方法是只检查getExtras()
的返回值:
//String intentResult = intent.getStringExtra("broadcast_event");
if (intent.getExtras() != null) {
List<ScanResult> results = intent.getParcelableArrayListExtra("broadcast_event");
作为旁注,我认为BroadcastReceiver
实施Parcelable
是必要的。
这里唯一需要实现Parcelable
的是ScanResult
,which it does。