酷乐天气开发记录总结6

后台自动更新天气

新建一个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>

原文地址:https://www.cnblogs.com/lemonhome/p/4492643.html