实战开发-Ashurol天气预报APP(四)

本文详细介绍了一个天气App的开发过程,包括如何实现城市切换、天气更新功能,并加入自动更新天气的功能,以及如何设置App图标和应用名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  趁热打铁,现在进入第四阶段的代码编写。在上一阶段结束后会存在一个问题,当你选择一个城市后,就没有办法查看其它城市的天气了,及时退出,下一次进来后还会直接跳转到WeatherActivity.这里就将代码优化一下

在weather_layout中加入两个按钮,前一阶段已经提前加入了,这里就不重复给代码了

接着修改WeatherActivity活动里的代码

定义按钮,注册监听器,实现监听方法

/*
	 *切换城市按钮
	 */
	private Button switchCity;
	/*
	 *更换天气按钮
	 */
	private Button refreshWeather;
                switchCity=(Button) findViewById(R.id.switch_city);
		refreshWeather=(Button) findViewById(R.id.refresh_weather);
		switchCity.setOnClickListener(this);
		refreshWeather.setOnClickListener(this);
/*
	 * 判断当前操作
	 */
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		
		switch(v.getId())
		{
		case R.id.switch_city:
			Intent intent=new Intent(this,ChooseAreaActivity.class);
			intent.putExtra("from_weather_activity", true);
			startActivity(intent);
			finish();
			break;
		case R.id.refresh_weather:
			publishText.setText("同步中...");
			SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this);
			String weatherCode=prefs.getString("weather_code", "");
			if(!TextUtils.isEmpty(weatherCode))
			{
				queryWeatherInfo(weatherCode);
			}
			break;
			default:
				break;
		}
	}

当点击的是切换城市按钮,由于目前已经选过一个城市,如果直接跳转到ChooseAreaActivity,会立刻又跳回来,因此这里要在Intent中加入一个from_weather_activity标志位

,接着更改ChooseAreaActivity对这个标志位进行处理,定义一个Boolean值

/*
* 是否从WeatherActivity中跳转过来
*/
private boolean isFromWeatherActivity;
接着在Oncreate()方法中添加一下代码

isFromWeatherActivity=getIntent().getBooleanExtra("from_weather_activity", false);

//已经选择了城市且不是从WeatherActivity跳转过来,才会直接跳转到WeatherActivity
		if(prefs.getBoolean("city_selected", false)<strong>&&!isFromWeatherActivity</strong>)
		{
			Intent intent=new Intent(this,WeatherActivity.class);
			startActivity(intent);
			finish();
			return;
		}

另外在OnbackPressed()中加入if()判断,当按下Back键时,如果是从WeatherActivity跳转过来的,则应该重新回到WeatherActivity。代码如下

public void onBackPressed()
	{
		if(currentLevel==LEVEL_COUNTY)
		{
			queryCities();
		}else if(currentLevel==LEVEL_CITY)
		{
			queryProvinces();
		}else{
			if(isFromWeatherActivity)
			{
				Intent intent=new Intent(this,WeatherActivity.class);
				startActivity(intent);
			}
			finish();
		}
	}

现在切换城市的按钮以及更新天气的按钮功能已经完成了。

最后添加APP的最后一个功能

为了让程序更加智能,这里考虑加入自动更新天气的功能。首先在service包中新建一个AutoUpdateService继承Service,代码如下:

public class AutoUpdateService extends Service{

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				updateWeather();
				
			}
		}).start();
		AlarmManager manager=(AlarmManager) getSystemService(ALARM_SERVICE);
		int anHour=8*60*60*1000;//这时8小时的毫秒数
		long triggerAtTime=SystemClock.elapsedRealtime()+anHour;
		Intent i=new Intent(this,AutoUpdateReceiver.class);
		PendingIntent pi=PendingIntent.getBroadcast(this, 0, i, 0);
		manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
		return super.onStartCommand(intent, flags, startId);
	}
	private void updateWeather()
	{
		SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this);
		String weatherCode=prefs.getString("weather_code", "");
		String address="http://www.weather.com.cn/data/cityinfo/"+weatherCode+".html";
		HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {
			
			@Override
			public void onFinish(String response) {
				// TODO Auto-generated method stub
				Utility.handleWeatherResponse(AutoUpdateService.this, response);
				
			}
			
			@Override
			public void onError(Exception e) {
				// TODO Auto-generated method stub
				
			}
		});
	}

}

在onstartCommand()方法中先开启一个子线程,然后在子线程中调用updateWeather()方法来更新天气。还需要创建BroadcastReceive,来辅助实现定时刷新功能,代码如下:

public class AutoUpdateReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		Intent i=new Intent(context,AutoUpdateService.class);
		context.startService(i);
	}

}

通过OnReceive()中再次启动AutoUpdateService,就可以实现后台定时

最后需要在代码某处去第一次启动AutoUpdateService,在WeatherActivity中的showWeather()中最后加入

//激活AutoUpdateService
		Intent intent=new Intent(this,AutoUpdateService.class);
		startService(intent);

最后别忘了在AndroidManifest中注册新增的服务于广播

        <service 
            android:name="service.AutoUpdateService">
            
        </service>
        <receiver android:name="receiver.AutoUpdateReceiver">
            
        </receiver>
一个好的App图标可以增彩不少,现在我们就为程序添加一个性感的图标

在AndroidManifest.xml文件中里的icon属性更改默认的Android图标

 <application
        android:allowBackup="true"
        android:icon="@drawable/logo"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="activity.ChooseAreaActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="activity.WeatherActivity"
            android:label="@string/app_name" >
            
        </activity>
        <service 
            android:name="service.AutoUpdateService">
            
        </service>
        <receiver android:name="receiver.AutoUpdateReceiver">
            
        </receiver>
        
    </application>

最后在res/values/string.xml中更改下应用名称

<resources>

    <string name="app_name">Ashurol天气</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>

</resources>
到这里,App也按初定实现目标完成了!

最后在叨逼一句,

---梦想还是要有的,万一不小心实现了呢!

花万分的努力,乘以1/10000,等于百分之百的实现!今天你我努力了吗?



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值