我有一个应用程序,我想每隔 15 分钟在其中查找一些数据。我有一项以警报开始的服务,但我还想在开始查找之前确保有网络连接。
为此,我认为我应该使用 aBroadcastReceiver
来观察网络状态的变化。我已经包装了一个广播接收器来帮助解决这个问题:
public abstract class NetworkMonitor extends BroadcastReceiver
{
boolean mDoingStuff;
public abstract void doStuff();
public NetworkMonitor()
{
mDoingStuff = false;
IntentFilter networkStateFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
MyApp.getContext().registerReceiver(this, networkStateFilter);
}
@Override
public void onReceive(Context context, Intent intent)
{
// network state changes, you can process it, information in intent
ConnectivityManager cn = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = ConnectivityManagerCompat.getNetworkInfoFromBroadcast(cn, intent);
// Only use Wifi Connections for updating this
if (info.isConnectedOrConnecting() && !mDoingStuff)
{
mDoingStuff = true;
doStuff();
}
}
}
然后我在如下服务中使用它:
public class WidgetUpdateService extends Service
{
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
// Build the async task to get the data
final MyAsyncTask mTask = new MyAsyncTask();
// Register an interest in when the network changes
new NetworkMonitor(false)
{
public void doStuff()
{
mTask.execute();
}
};
// Make sure that if we get shut down then we get started again correctly.
return START_REDELIVER_INTENT;
}
protected class MyAsyncTask extends AsyncTask<Void, Void, Void>
{
public MyAsyncTask()
{
}
@Override
protected Integer doInBackground(Void... arg0)
{
// do work
}
@Override
protected void onPostExecute(Integer result)
{
WidgetUpdateService.this.stopSelf();
}
@Override
protected void onCancelled(Integer result)
{
WidgetUpdateService.this.stopSelf();
}
}
}
其中 MyAsyncTask 是一个内部类,它将导致服务在完成时 stopSelf()。
这有点工作,但是:
- 我(根据 logcat)接到的电话
NetworkMonitor.doStuff()
比我预期的要多得多。似乎即使服务已停止(在异步任务正确完成之后),NetworkMonitor
实例仍在接收有关网络状态更改的意图。为什么是这样? - 我是否需要一个变量来将
NetworkMonitor()
实例存储在服务中,或者我可以只拥有一个像这样的匿名实例吗?查看文档BroadcastReceiver
应该在完成后自行清理onReceive()
。 - 为什么我需要
NetworkMonitor.mDoingStuff
?我猜如果我能弄清楚为什么在完成NetworkMonitor
后没有自行清理,onReceive()
那么我可能不再需要它了? - 这是一种明智的做法还是我在自找麻烦?
如果您需要更多信息,请告诉我,我很乐意提供。