`
xihuan&java
  • 浏览: 159662 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android 应用

阅读更多
最近做了一个简单的天气预报,话不多说上代码
实时天气的handler:
package com.handler;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.javaBean.Weather;
/**
 * 显示当天的详细天气情况
 * @author wdw
 *  
 */
public class NonceXmlHandler extends DefaultHandler
{
	private List<Weather>nowWeatherList;

	private boolean tag;

	private Weather weather;

	public List<Weather> getNowWeatherList() 
	{
		return nowWeatherList;
	}

	public void setNowWeatherList(List<Weather> nowWeatherList) 
	{
		this.nowWeatherList = nowWeatherList;
	}
    //构造方法
	public NonceXmlHandler()
	{
		nowWeatherList = new ArrayList<Weather>();
		tag = false;
	}

	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException
			{
		        String tagName = localName.length()!=0 ? localName : name;
		        tagName = tagName.toLowerCase();
		        if (tagName.equals("current_conditions")) 
		        {
					tag = true;
					weather = new Weather();
				}
		        if (tag) 
		        {
					 if (tagName.equals("temp_c"))
					{
						weather.setLowTemp(attributes.getValue("data"));
					}
					else if (tagName.equals("temp_f"))
					{
						weather.setHighTemp(attributes.getValue("data"));
					}
					else if (tagName.equals("icon"))
					{
						weather.setImgUrl(attributes.getValue("data"));
					}
					else if (tagName.equals("condition"))
					{
						weather.setCircs(attributes.getValue("data"));
					}
					else if (tagName.equals("wind_condition"))
					{
						weather.setWind(attributes.getValue("data"));
					}
		        	else if (tagName.equals("humidity"))
		        	{
						weather.setHumidity(attributes.getValue("data"));
					}
				}
	         }

	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		String tagName = localName.length()!=0 ? localName : name;
		tagName = tagName.toLowerCase();
		if(tagName.equals("current_conditions"))
		{
			tag = false;
			nowWeatherList.add(weather);
		}
		super.endElement(uri, localName, name);
	}
    
}

四天内天气的handler
package com.handler;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.javaBean.Weather;
/**
 * 
 * @author wdw
 *
 */
public class XmlHandler extends DefaultHandler{

	private List<Weather>weatherList;
	
	private boolean tag;
	
	private Weather weather;
    //list的get/set方法
	public List<Weather> getWeatherList() {
		return weatherList;
	}

	public void setWeatherList(List<Weather> weatherList) {
		this.weatherList = weatherList;
	}
	//构造方法
	public XmlHandler()
	{
		weatherList = new ArrayList<Weather>();
		tag = false;
	}

	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		    
	        String tagName = localName.length()!=0 ? localName : name;
	        tagName = tagName.toLowerCase();
	        
	        if (tagName.equals("forecast_conditions")) {
				tag = true;
				weather = new Weather();
			}
	        if (tag)
	        {
				if (tagName.equals("day_of_week")) 
				{
					weather.setDayString(attributes.getValue("data"));
				}
				else if (tagName.equals("low"))
				{
					weather.setLowTemp(attributes.getValue("data"));
				}
				else if (tagName.equals("high"))
				{
					weather.setHighTemp(attributes.getValue("data"));
				}
				else if (tagName.equals("icon"))
				{
					weather.setImgUrl(attributes.getValue("data"));
				}
				else if (tagName.equals("condition"))
				{
					weather.setCircs(attributes.getValue("data"));
				}
				else if (tagName.equals("wind_condition"))
				{
					weather.setWind(attributes.getValue("data"));
				}
			}
	}
	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		super.endElement(uri, localName, name);
		
		String tagName = localName.length()!=0 ? localName : name;
		tagName = tagName.toLowerCase();
		if(tagName.equals("forecast_conditions"))
		{
			tag = false;
			weatherList.add(weather);
		}
	}
	
	
}

activity
package com.weather;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import com.database.WeatherDAO;
import com.handler.NonceXmlHandler;
import com.handler.XmlHandler;
import com.javaBean.Weather;
import com.util.LunarCalendarUtils;

import android.R.integer;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;

/**
 * 
 * @author wdw
 *
 */
public class WeatherActivity extends Activity {
	
	private Spinner selectCity;
	private EditText inputCity;
	private Button  onSure;
	private TextView showCity;
	private ImageView weaView;
	private Handler weatherHandler;
	private Dialog progressDialog;
	private Timer  timer;
	public static final String STR_DESKTOP_TO_APP_EXPAND = "DESKTOP_TO_APP_FLAG_EXPAND";
	public static final String STR_DESKTOP_TO_APP_ID = "DESKTOP_TO_APP_FLAG_ID";
	public static final String STR_DESKTOP_TO_APP_TYPE = "DESKTOP_TO_APP_FLAG_TYPE";
	private Intent myIntent;
	private final String ACTION_ADD_SHORTCUT="com.android.launcher.action.INSTALL_SHORTCUT";
	private String weatherStr;
	private final  int MENU_SENDTOP=Menu.FIRST;
	private final  int MENU_EXIT=Menu.FIRST+1;
	private WeatherDAO weatherDAO;
	private Cursor myCursor;
	private TableLayout table;
	private LunarCalendarUtils calendarUtils;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myIntent = new Intent(this,SendWeather.class);
        weatherDAO = new WeatherDAO(this);
        timer = new Timer();
        selectCity = (Spinner)findViewById(R.id.weaSpCity);
        inputCity = (EditText)findViewById(R.id.weaEtCity);
        onSure  = (Button)findViewById(R.id.weaBtSearch);
        showCity = (TextView)findViewById(R.id.weaTvCity);
        weaView = (ImageView)findViewById(R.id.weaIv);
        
        progressDialog = new AlertDialog.Builder(this)
        .setTitle("读取数据中")
        .setMessage("正在加载数据,请稍等!")
        .create();
        
        weatherHandler = new Handler()
        {

			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				final String cityName = inputCity.getText().toString();
				searchWeather(cityName);
				searchNowWeather(cityName);
				progressDialog.hide();
			}
        };
        
        selectCity.setOnItemSelectedListener(new OnItemSelectedListener(){

			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				inputCity.setText(selectCity.getSelectedItem().toString());
				
			}

			public void onNothingSelected(AdapterView<?> parent) {
				// TODO Auto-generated method stub
			}
        });
        onSure.setOnClickListener(new View.OnClickListener(){

			public void onClick(View v) {
				
				progressDialog.show();
				timer.schedule(new TimerTask(){

					@Override
					public void run() {
						Message message = new Message();
						message.setTarget(weatherHandler);
						message.sendToTarget();
					}
					
				}, 100);
				
			}
        	
        });
        showCity.setOnClickListener(new View.OnClickListener(){
			public void onClick(View v) {
				searchNowWeather(inputCity.getText().toString());
				goTO();
			}
        	
        });
    }
    /**创建menu*/
    @Override
    /*创建menu*/
	public boolean onCreateOptionsMenu(Menu menu) {
		 super.onCreateOptionsMenu(menu);
		menu.add(0, MENU_SENDTOP, 1, "发送快捷方式").setIcon(android.R.drawable.ic_menu_share);
		menu.add(0,MENU_EXIT,2,"返回桌面").setIcon(android.R.drawable.ic_menu_revert);
		return true;
	}
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
		case MENU_SENDTOP:
			searchNowWeather(inputCity.getText().toString());
			weatherStr=showCity.getText().toString();
			Parcelable icon =Intent.ShortcutIconResource.fromContext(this, R.drawable.weather);
			Intent addShortCut = new Intent(ACTION_ADD_SHORTCUT);
			addShortCut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
			addShortCut.putExtra(Intent.EXTRA_SHORTCUT_NAME, weatherStr);
			myIntent.setData(Uri.parse(weatherStr));
			Bundle bundle = new Bundle();
			bundle.putString("weather", weatherStr);
			myIntent.putExtras(bundle);
			addShortCut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,
					myIntent);
			sendBroadcast(addShortCut);
			goTO();
			break;

		case MENU_EXIT:
			goTO();
			finish();
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	
    /**查询当天天气*/
    public void searchNowWeather(String city)
    {
    	SAXParserFactory spf = SAXParserFactory.newInstance();
    	try {
			SAXParser sParser = spf.newSAXParser();
			XMLReader reader = sParser.getXMLReader();
			
			NonceXmlHandler nowHandler = new NonceXmlHandler();
			reader.setContentHandler(nowHandler);
			
			URL url = new URL("http://www.google.com/ig/api?hl=zh-cn&weather="+URLEncoder.encode(city));
			InputStream iStream = url.openStream();
			InputStreamReader isr = new InputStreamReader(iStream,"GBK");
			InputSource source = new InputSource(isr);
			reader.parse(source);
			
			List<Weather> weatherList = nowHandler.getNowWeatherList();
			  for (Weather weather:weatherList)
			  {
				  weaView.setImageDrawable(loadImage(weather.getImgUrl()));
				  weaView.setMinimumHeight(80);
				  String strLine = System.getProperty("line.separator");
					showCity.setText(inputCity.getText().toString()+"实时天气:"
							+strLine+weather.getLowTemp() + "℃"
							+"  、 "+weather.getCircs()
							+strLine+weather.getWind()
							+strLine+weather.getHumidity());
					
			}
			  weatherStr = showCity.getText().toString();
		} catch (Exception e) {
			new AlertDialog.Builder(this)
            .setTitle("解析错误")
            .setMessage("获取当天天气数据失败,请稍候再试。")
            .setNegativeButton("确定", null)
            .show();
		}
    }
    /**查询四天内的天气*/
    public void searchWeather(String city)
    {
    	 SAXParserFactory spf = SAXParserFactory.newInstance();
         try {
             SAXParser sp = spf.newSAXParser();
             XMLReader reader = sp.getXMLReader();
             
             XmlHandler  handler = new XmlHandler();
             reader.setContentHandler(handler);            

             URL url = new URL("http://www.google.com/ig/api?hl=zh-cn&weather=" + URLEncoder.encode(city));
             InputStream is = url.openStream();
             InputStreamReader isr = new InputStreamReader(is,"GBK");
             InputSource source = new InputSource(isr);

             reader.parse(source);
             
             List<Weather> weatherList = handler.getWeatherList();
             
             table = (TableLayout)findViewById(R.id.weaTable);
             table.removeAllViews();
             
             
             
             for(Weather weather : weatherList) {
                 
                 TableRow row = new TableRow(this);
                                 
                 row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
                 
                 row.setGravity(Gravity.CENTER_VERTICAL);
                
                	 ImageView img = new ImageView(this);
                     img.setImageDrawable(loadImage(weather.getImgUrl()));
                     img.setMinimumHeight(80);
                     
                     row.addView(img);
                     
                     TextView day = new TextView(this);
                     day.setText(weather.getDayString());
                     day.setGravity(Gravity.CENTER_HORIZONTAL);
                     
                     row.addView(day);
                    
                     TextView temp = new TextView(this);
                     temp.setText(weather.getLowTemp() + "℃ - " + weather.getHighTemp() + "℃");
                     temp.setGravity(Gravity.CENTER_HORIZONTAL);
                     
                     row.addView(temp);
                     
                     TextView condition = new TextView(this);
                     condition.setText(weather.getCircs());
                     condition.setGravity(Gravity.CENTER_HORIZONTAL);
                     
                     row.addView(condition);
                     
                     TextView wind = new TextView(this);
                     wind.setText(weather.getWind());
                     wind.setGravity(Gravity.CENTER_VERTICAL);
                     
                     row.addView(wind);
                     
                     table.addView(row);
                     
				}
                 
             
         } catch (Exception e) {
             
             new AlertDialog.Builder(this)
             .setTitle("解析错误")
             .setMessage("获取天气数据失败,请稍候再试。")
             .setNegativeButton("确定", null)
             .show();

         }        
    	
    }
    //加载天气图片
	private Drawable loadImage(String imgUrl) {
		try {
			return Drawable.createFromStream((InputStream) new URL("http://www.google.com/" + imgUrl).getContent(), "demo");
		}catch (MalformedURLException e) {
            
            Log.e("exce",e.getMessage());
        }
		catch (Exception e) {
			Log.e("exce", e.getMessage());
		}
		return null;
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		goTO();
	}
	//发送快捷方式
	public void goTO()
	{
		searchNowWeather(inputCity.getText().toString());
		weatherStr=showCity.getText().toString();
		    Intent intent = new Intent("com.android.CLICK");
			Bundle bundle1 =new Bundle();
			bundle1.putString("weather", weatherStr);
			intent.putExtras(bundle1);
	        WeatherActivity.this.sendBroadcast(intent);
	}
	//插入天气
	public void insert()
	{
		weatherDAO.weatherInsert(weatherStr, table.toString());
	}
	//更新天气
	public void update(int id,String timeString,String todayString)
	{
		weatherDAO.updateWeather(id, timeString, todayString);
	}
}

发送天气
引用
package com.weather;


import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.os.Bundle;

import android.view.LayoutInflater;
import android.view.View;
import android.content.DialogInterface;
import android.content.Intent;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.Toast;
import android.telephony.SmsManager;
/**
* 发送短信界面
* @author wdw
*
*/
public class SendWeather extends Activity {
private EditText editNumber;
private EditText messagEditText;
    private String weatherString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

showDialog();
        //得到数据
try {
    Bundle bundle = this.getIntent().getExtras();
weatherString=bundle.getString("weather");
        messagEditText.setText(weatherString);
} catch (Exception e) {
e.printStackTrace();
}
      
editNumber.requestFocus();
       
}
/**检查字符串是否为电话号码的格式*/
public static boolean isPhoneNumberValid(String phoneNumber)
{
// boolean isValid=false;
// String expression="^\\(?(\\d{3})\\)?[- ]?(?(\\d{3})\\)?[- ]?(\\d{5})$";
// String expression2="^\\(?(\\d{3})\\)?[- ]?(?(\\d{4})\\)?[- ]?(\\d{4})$";
// CharSequence inputStr=phoneNumber;
// /*创建pattern*/
// Pattern pattern=Pattern.compile(expression);
// /*将pattern以参数传入Matcher*/
// Matcher matcher=pattern.matcher(inputStr);

// Pattern pattern2=Pattern.compile(expression2);
// Matcher matcher2=pattern2.matcher(inputStr);
// if(matcher.matches()||matcher2.matches())
// {
// isValid=true;
// }
return true;

}
//弹出框
public void showDialog()
{
LayoutInflater factory = LayoutInflater.from(this);
        final View view = factory.inflate(R.layout.send_weather, null);
        LinearLayout layout=(LinearLayout)view.findViewById(R.id.sendWeather);
        editNumber=(EditText)layout.findViewById(R.id.numberEdit);
        messagEditText=(EditText)layout.findViewById(R.id.weatherEdit);
new AlertDialog.Builder(this).setTitle("发送温情").setView(view)
        .setPositiveButton("发送", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
//取得短信收件人电话
String number = editNumber.getText().toString();
//取得短信内容
String message = messagEditText.getText().toString();
/*构建default 的instance的SmsManager*/
SmsManager smsManager =SmsManager.getDefault();
/*检查电话格式与短信字数是否超过70个字符*/
if(number.equals("")) {
Toast.makeText(SendWeather.this, "请输入发送号码!", Toast.LENGTH_LONG).show();
onCreate(null);
return;
} else
{
if(isPhoneNumberValid(number)==true&&isWithin(message)==true)
{
try
{
PendingIntent pendingIntent =PendingIntent.getBroadcast(SendWeather.this, 0, new Intent(),0);
smsManager.sendTextMessage(number, null, message,pendingIntent , null);
}
catch(Exception e)
{
e.printStackTrace();
}
// Toast.makeText(NoteActivity.this, "发送成功!", Toast.LENGTH_LONG).show();
// Intent intent = new Intent(NoteActivity.this,MyNote.class);
// startActivity(intent);
finish();
}
else{
if(isPhoneNumberValid(number)==false)
{
if(isWithin(message)==false)
{
Toast.makeText(SendWeather.this,
"电话号码格式错误和短信内容超过70字请检查!", Toast.LENGTH_LONG).show();
onCreate(null);
}
else{
Toast.makeText(SendWeather.this,
"电话号码格式错误请检查!", Toast.LENGTH_LONG).show();
onCreate(null);
}

}
else if(isWithin(message)==false)
{

Toast.makeText(SendWeather.this,
"短信内容超过70字请删除部分内容!", Toast.LENGTH_LONG).show();
onCreate(null);
}
}
}

}
       
        })
        .setNegativeButton("取消", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {

// Intent intent = new Intent(NoteActivity.this,MyNote.class);
// startActivity(intent);
finish();
}
       
        }).show();
}
/**判断短信长度*/
public static boolean isWithin(String text)
{
if(text.length()<=70)
{
return true;
}
else{
return false;
}
}
/**结束*/
public void finish()
{
super.finish();
}
}
  • 大小: 22.1 KB
  • 大小: 19.2 KB
分享到:
评论

相关推荐

    《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf

    《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用...

    android应用开发范例精解

    《Android应用开发范例精解》通过通俗易懂的开发实例及项目案例,详细介绍了Android应用开发的知识体系及实用开发技术。 《Android应用开发范例精解》共14章,分为3篇。第1篇为基础篇,涵盖Android背景及开发环境和...

    Android应用源码45套安卓源码合集.zip

    Android应用源码45套安卓源码合集: android中文离线发音引擎FOCTTS使用源码.rar Android应用源码(精)LBS签到应用源码.rar Android应用源码(精)xUtils2.2.5.rar Android应用源码(精)仿博客园客户端源码.rar Android...

    《Android应用程序开发教程(第2版)》教学课件01Android系统与开发环境.pdf

    《Android应用程序开发教程(第2版)》教学课件01Android系统与开发环境.pdf《Android应用程序开发教程(第2版)》教学课件01Android系统与开发环境.pdf《Android应用程序开发教程(第2版)》教学课件01Android系统与开发...

    Android应用源码11套安卓源码合集.zip

    Android应用源码11套安卓源码合集: Android Gps日志记录程序源码.rar Android listview 滑动删除(具体效果360手机卫士后台通知).rar Android MP3播放器,带卡拉OK字幕.rar Android “遇见”android应用源码.rar ...

    Android应用开发案例教程 (毋建军、徐振东、林瀚 编著) pdf

    《高等学校计算机科学与技术项目驱动案例实践规划教材:Android应用开发案例教程》应用“项目驱动(Project-Driven)”最新教学模式,通过完整的项目案例系统地介绍了使用Android技术设计与开发应用系统的理论和方法...

    Android应用开发详解+原书代码.rar(完整版)

    作为一本Android应用开发书籍,本书既适合Android初学者,也适合具备了一定Android开发经验丹需要开发案例的高级读者。 本书分为三个部分,共18章,由浅入深地详细介绍了Android的每个开发细节。 本书基础翔实,...

    Android应用程序输入事件处理机制

    在Android应用程序中,有一类特殊的消息,是专门负责与用户进行交互的,它们就是触摸屏和键盘等输入事件。触摸屏和键盘事件是统一由系统输入管理器InputManager进行分发的。也就是说,InputManager负责从硬件接收...

    《Android应用开发详解》源码

    《Android应用开发详解》源码,完整版,值得看一看。 《Android核心技术和开发详解》各章案例的全部源代码,第一章将要介绍的是Android开发起步的相关知识,首先对Android平台进行简单的介绍,其中包括Android的背景...

    Android 应用案例开发大全3.part03.rar

    Android应用案例开发大全(第3版) 源码 part3/part7 本书以Android手机综合应用程序开发为主题,通过11个典型范例全面且深度地讲解了单机应用、网络应用、商业案例、2D/3D游戏等多个开发领域。 全书共分12章,主要以...

    Android应用开发,完整扫描版

    《Android应用开发》通过丰富而翔实的实例展示了在Android平台下开发手机应用软件所必需的概念和技术。书中不仅对Android应用程序的开发环境和调试方法进行了详细介绍,而且对Android软件开发的一些关键技术和API...

    Android应用的构成 Android应用的构成 Android应用的构成

    Android应用的构成 Android应用的构成 Android应用的构成 Android应用的构成 Android应用的构成 Android应用的构成 Android应用的构成 Android应用的构成 Android应用的构成

    《Android应用测试与调试实战》施懿民高清PDF完整版

    《Android应用测试与调试实战》高清完整版是Android应用测试与调试领域最为系统、深入且极具实践指导意义的著作,由拥有近10年从业经验的资深软件开发工程师和调试技术专家撰写,旨在为广大程序员开发高质量的...

    打造高质量Android应用:Android开发必知的50个诀窍

    资源名称:打造高质量Android应用:Android开发必知的50个诀窍内容简介: 《打造高质量Android应用:Android开发必知的50个诀窍》是目前唯一一本从开发技巧角度讲解Android应用开发的著作,旨在迅速提高开发者解决...

    Android应用开发详解.pdf (附源码)

    Android应用开发详解是一本Android应用开发书籍,既适合Android初学者,也适合具备了一定Android开发经验但需要开发案例的高级读者。 该书分为三个部分,共18章,由浅入深地详细介绍了Android的每个开发细节。 该书...

    Android应用程序开发

    Android应用程序开发 英文

    88个Android应用程序

    88个Android应用程序,希望对大家学习Android有帮助 GestureRecogniseSample GetPostSample GridAndImageSwitcherSample...

    android实战 Android应用市场(android studio源程序工程)

    包括Android 移动开发基础案例教程课本中第五章实战演练——Android应用市场的源代码,可用Android studio运行,适合初学者学习。

    AndroidStudio实战快速高效地构建Android应用 AndroidStudio 高清完整带目录书签 PDF AndroidStudio实战

    AndroidStudio实战快速高效地构建Android应用 AndroidStudio 高清完整带目录书签 PDF AndroidStudio实战

Global site tag (gtag.js) - Google Analytics