后台自动更新天气
新建一个AutoUpdateServive继承自Service代码如下:
@Override publicIBinder onBind(Intent intent) { returnnull; } @Override publicint onStartCommand(Intent intent, int flags, int startId) { newThread(new Runnable() { @Override publicvoid run() { updateWeather(); } }).start(); AlarmManagermanager = (AlarmManager) getSystemService(ALARM_SERVICE); // intanHour = 8 * 60 * 60 * 1000; // 这是8小时的毫秒数 intanHour = 3 * 1000; // 这是8小时的毫秒数 longtriggerAtTime = SystemClock.elapsedRealtime() + anHour; Intenti = new Intent(this, AutoUpdateReceiver.class); PendingIntentpi = PendingIntent.getBroadcast(this, 0, i, 0); manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime, pi); returnsuper.onStartCommand(intent, flags, startId); } /** * 更新天气信息。 */ privatevoid updateWeather() { SharedPreferencesprefs = PreferenceManager.getDefaultSharedPreferences(this); StringweatherCode = prefs.getString("weather_code", ""); Stringaddress = "http://www.weather.com.cn/data/cityinfo/" + weatherCode +".html"; HttpUtil.sendHttpRequest(address,new HttpCallbackListener() { @Override publicvoid onFinish(String response) { Log.d("TAG",response); Utility.handleWeatherResponse(AutoUpdateService.this,response); } @Override publicvoid onError(Exception e) { e.printStackTrace(); } }); }
在 onStartCommand()方法中先是开启了一个子线程,然后在子线程中调用updateWeather()方法来更新天气,我们仍然会将服务器返回的天气数据交给 Utility 的handleWeatherResponse()方法去处理, 这样就可以把最新的天气信息存储到SharedPreferences文件中。
http://www.itfriend.cn/user/singwhatiwanna/article/details/100554
创建定时任务,为了保证软件不会消耗过多的流量,这里将时间间隔设置为 8 小时,8小时后就应该执行到 AutoUpdateReceiver的 onReceive()方法中了,在 receiver 包下新建 AutoUpdateReceiver继承自 BroadcastReceiver,代码如下所示:
@Override publicvoid onReceive(Context context, Intent intent) { Intenti = new Intent(context, AutoUpdateService.class); context.startService(i); }
这里只是在 onReceive()方法中再次去启动 AutoUpdateService,就可以实现后台定时更
新的功能了。不过,我们还需要在代码某处去激活 AutoUpdateService 这个服务才行。修改
WeatherActivity中的代码,如下所示:
private void showWeather() { SharedPreferencesprefs = PreferenceManager.getDefaultSharedPreferences(this); cityNameText.setText(prefs.getString("city_name", "")); temp1Text.setText(prefs.getString("temp1","")); temp2Text.setText(prefs.getString("temp2","")); weatherDespText.setText(prefs.getString("weather_desp","")); publishText.setText("今天" +prefs.getString("publish_time", "") + "发布"); currentDateText.setText(prefs.getString("current_date","")); weatherInfoLayout.setVisibility(View.VISIBLE); cityNameText.setVisibility(View.VISIBLE); Intentintent = new Intent(this, AutoUpdateService.class); startService(intent); }
可以看到,这里在 showWeather()方法的最后加入启动 AutoUpdateService这个服务的代
码,这样只要一旦选中了某个城市并成功更新天气之后,AutoUpdateService就会一直在后台运行,并保证每 8 小时更新一次天气。
在 AndroidManifest.xml 中注册新增的服务和广播接收器,如下所示:
<serviceandroid:name="com.coolweather.app.service.AutoUpdateService"></service> <receiverandroid:name="com.coolweather.app.receiver.AutoUpdateReceiver"></receiver>