1. 搭建Android开发环境

方式一:使用ADT插件安装

ADT插件的下载与安装,ADT插件获取网址:http://www.androiddevtools.cn/

下载好的ADT插件如图所示:

在eclipse->help->install new software中:

eclipse安装完ADT插件后会提示重启eclipse

方式二:直接使用eclipse for adt开发环境

集成开发环境下载:http://www.androiddevtools.cn/

2. 更新SDK和创建AVD

注意:

在AVD中创建时发现OK按钮一直是灰色,如图:

则使用SDK Manager更新:

发现packages的可选安装包很少;且连接到google出错,但是使用google浏览器打开出错的网址却是正常的。

打开sdk文件夹,发现子文件夹与packages差不多;则应是sdk/tools文件夹需要更新,重新下载tools文件夹的内容并覆盖;重启eclipse,打开SDK Manager,发现有很多包需要更新,也包括System Image的包。

更新完成后,发现可以创建AVD了, OK!

问题:创建好AVD后,启动AVD报错如下:

并且SDK Manager也报HAXM的错误如下:

解决方法如下:

去intel官网下载window相关的组件并安装

下载网址:https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager-end-user-license-agreement

下载后解压如图:

双击intelhaxm-android.exe安装,重启AVD,成功!

2. 创建android项目

使用ADT创建一个Android Application Project如下:

创建完后的项目目录树如下:

3. 如何使用真机调试android应用程序

a. 使用USB连接PC机和android手机,并允许USB调试

b. 在sdk/platform-tools下使用adb devices查看android设备

例:

这种情况下拔掉USB连接线,并重新连接

这种情况是正确的,说明PC机和android设备连接成功

c. 在右键->Run As->Run Configurations的target选项板里选择第一个

发现真机上运行android应用程序成功!

在devices视图中点击screen capture可以在PC机上展现android手机的界面

如图:

4. 编写android应用程序的splash页面

功能点:

a. 使用背景图片展示logo

b. 在页面中间展示版本名称

c. 在版本名称下方中间展示进度条

代码如下:

package com.example.safe;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;

public class SplashActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        去除当前Activity的头部, 若要去除所有页面的头部则需要在配置文件中配置
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_splash);
    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.safe.SplashActivity" >

    <!-- 版本名称放在页面的正中间,并设置阴影效果 -->
    <TextView
        android:id="@+id/tv_version_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:shadowDx="1"
        android:shadowDy="1"
        android:shadowColor="#f00"
        android:shadowRadius="5"
        android:textSize="16sp"
        android:text="版本名称" />

    <!-- 将进度条放在版本名称的正下方 -->
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/tv_version_name"
        />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.safe"
    android:versionCode="1"
    android:versionName="1.0" android:installLocation="preferExternal">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name=".SplashActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

程序运行结果如下:

修改程序,直接从配置文件中获取版本名称并显示在splash页面:

package com.example.safe;

import android.support.v7.app.ActionBarActivity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.TextView;

public class SplashActivity extends ActionBarActivity {
	private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        去除当前Activity的头部, 若要去除所有页面的头部则需要在配置文件中配置
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_splash);

        //初始化UI
        this.initUI();

        //初始化数据
        this.initData();
    }

    /**
     * 初始化UI
     */
    private void initUI() {
		textView = (TextView)this.findViewById(R.id.tv_version_name);
	}

    /**
     * 初始化数据
     */
	private void initData() {
		// TODO Auto-generated method stub
		String versionName = this.getVersionName();
		this.textView.setText("版本名称:" + versionName);
	}

	/**
	 * 获取应用版本名称
	 * @return
	 */
	private String getVersionName() {
		PackageManager packageManager = this.getPackageManager();
		try {
			PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(), 0);
			String versionName = packageInfo.versionName;
			return versionName;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
}

注意:

a. 使用快捷键Ctrl+1 快速按照提示完成

b. 使用快捷键Alt+/ 代码提示

运行结果如下所示:

5. 检测应用程序版本更新

首先,在tomcat服务器上有一个update.json文件包括versionCode, versionName, versionDesc, downloadUrl 这四个参数,并且可以访问成功

如图:启动tomcat85并访问该json文件成功!

然后,读取tomcat服务器的json键值对数据并比对versionCode

代码如下:

package com.example.safe;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.json.JSONException;
import org.json.JSONObject;

import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;

public class SplashActivity extends ActionBarActivity {
	protected static final String TAG = "SplashActivity";
	protected static final int MESSAGE_UPDATE = 101;
	protected static final int MESSAGE_URLEXCEPTION = 102;
	protected static final int MESSAGE_IOEXCEPTION = 103;
	protected static final int MESSAGE_JSONEXCEPTION = 104;
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case MESSAGE_UPDATE:
				Toast.makeText(SplashActivity.this, "请下载最新版本", Toast.LENGTH_SHORT).show();
				break;
			case MESSAGE_URLEXCEPTION:
				Toast.makeText(SplashActivity.this, "URL异常", Toast.LENGTH_SHORT).show();
				break;
			case MESSAGE_IOEXCEPTION:
				Toast.makeText(SplashActivity.this, "IO异常", Toast.LENGTH_SHORT).show();
				break;
			case MESSAGE_JSONEXCEPTION:
				Toast.makeText(SplashActivity.this, "JSON异常", Toast.LENGTH_SHORT).show();
				break;
			default:
				break;
			}
		};
	};
	private TextView textView;
	private int versionCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        去除当前Activity的头部, 若要去除所有页面的头部则需要在配置文件中配置
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_splash);

        //初始化UI
        this.initUI();

        //初始化数据
        this.initData();

        //检测版本更新
        this.checkForUpdate();
    }

	/**
     * 初始化UI
     */
    private void initUI() {
		textView = (TextView)this.findViewById(R.id.tv_version_name);
	}

    /**
     * 初始化数据
     */
	private void initData() {
		int versionCode = this.getVersionCode();
		this.versionCode = versionCode;
		String versionName = this.getVersionName();
		this.textView.setText("版本名称:" + versionName);
	}

	/**
	 * 获取应用程序版本号
	 * @return
	 */
	private int getVersionCode() {
		PackageManager packageManager = this.getPackageManager();
		try {
			PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(), 0);
			int versionCode = packageInfo.versionCode;
			return versionCode;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return 0;
	}

	/**
	 * 获取应用版本名称
	 * @return
	 */
	private String getVersionName() {
		PackageManager packageManager = this.getPackageManager();
		try {
			PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(), 0);
			String versionName = packageInfo.versionName;
			return versionName;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 检测版本更新
	 */
	private void checkForUpdate() {
		new Thread() {
			@Override
			public void run() {
				//发送http请求update.json的内容
				try {
					//1.封装url
					URL url = new URL("http://10.0.2.2:8080/update.json");
					//2.打开http请求, 并设置http请求头
					HttpURLConnection connection = (HttpURLConnection) url.openConnection();
					connection.setConnectTimeout(2000);
					connection.setReadTimeout(3000);
					connection.setRequestMethod("POST");
					//3.获取http请求响应码
					if(connection.getResponseCode() == 200){
						//4.读取响应输入流
						InputStream is = connection.getInputStream();
						//5.将输入流转化为字符串
						ByteArrayOutputStream bos = new ByteArrayOutputStream();
						byte[] buffer = new byte[1024];
						int temp = -1;
						while((temp = is.read(buffer)) != -1){
							bos.write(buffer, 0, temp);
						}
						String json = bos.toString();
						//6.从json字符串中读取键值对
						JSONObject jsonObject = new JSONObject(json);
						String serverVersionCode = jsonObject.getString("versionCode");
						String versionName = jsonObject.getString("versionName");
						String versionDesc = jsonObject.getString("versionDesc");
						String downloadUrl = jsonObject.getString("downloadUrl");

						Log.i(TAG, serverVersionCode);
						Log.i(TAG, versionName);
						Log.i(TAG, versionDesc);
						Log.i(TAG, downloadUrl);

						//如果本地版本号低于服务器版本号,则弹框提示更新; 否则进入应用程序主界面
						if(versionCode < Integer.parseInt(serverVersionCode)){
							Message msg = new Message();
							msg.what = MESSAGE_UPDATE;
							handler.handleMessage(msg);
						}else{
							enterMain();
						}
					}
				}catch (MalformedURLException e) {
					Message msg = new Message();
					msg.what = MESSAGE_URLEXCEPTION;
					handler.handleMessage(msg);
				}catch (IOException e) {
					Message msg = new Message();
					msg.what = MESSAGE_IOEXCEPTION;
					handler.handleMessage(msg);
				}catch (JSONException e) {
					Message msg = new Message();
					msg.what = MESSAGE_JSONEXCEPTION;
					handler.handleMessage(msg);
				}
			}
		}.start();
	}

	/**
	 * 进入应用程序主界面
	 */
	protected void enterMain() {
		Intent intent = new Intent(this, MainActivity.class);
		startActivity(intent);
	}
}

  

6. 使用ADT的断点调试功能

设置断点:在代码的行首单击

开启断点调试: 项目名称处右键->Debug As->Android Application

跳转至下个断点:Debug工具栏->consume

取消断点调试:Debug工具栏->disconnect

进入断点内部:Debug工具栏->step into

进入下一行:Debug工具栏->step over

查看变量的值:选中代码->右键->Watch

Java ME之Android开发从入门到精通的更多相关文章

  1. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  2. Android 学习资料入门到精通(PDF集合)共54本

    最近收集一些安卓入门到精通,包含游戏编程,网络编程,多媒体开发,需要学习朋友就下载保持下来,下载链接在最下面 下面是网盘内容 14天学会安卓开发_(完整版).pdf Android 4  游戏高级编程 ...

  3. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  4. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  5. 使用Ant搭建Android开发环境入门

    使用Ant搭建Android开发环境入门   使用Ant搭建Android开发环境,建立android项目 配置Ant环境 下载Ant:http://ant.apache.org/bindownloa ...

  6. 2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告

    北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构  班级: 1623  姓名: 齐力锋 学号: 20162326 成绩: 指导教师: 娄嘉鹏/王志强 实验日期: 2017年5 ...

  7. 《Java 开发从入门到精通》—— 2.3 使用IDE工具序

    本节书摘来异步社区<Java 开发从入门到精通>一书中的第2章,第2.3节,作者: 扶松柏 , 陈小玉,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.3 使 ...

  8. Nginx开发从入门到精通 学习目录分享学习 (阿里著作)

    Nginx开发从入门到精通   缘起 nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部 ...

  9. C# Windows服务开发从入门到精通

    一.课程介绍 大家都知道如果想要程序一直运行在windows服务器上,最好是把程序写成windows服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动 ...

随机推荐

  1. 转载 1-EasyNetQ介绍(黄亮翻译) https://www.cnblogs.com/HuangLiang/p/7105659.html

    EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与R ...

  2. 使用java实现快速排序(挖坑填数法和指针交换法)

    快速排序:通过一趟排序,将数据分为两部分,其中一部分中的所有数据比另外一部分的所有数据要小,然后按照此方法,分别对这两部分进行排序,达到最终的排序结果. 每趟排序选取基准元素,比该基准元素大的数据放在 ...

  3. 初学Python——RabbitMQ的安装

    记录踩坑之路,本篇文章主要摘抄自CSDN博客https://blog.csdn.net/weixin_39735923/article/details/79288578 Windows10环境下安装R ...

  4. P3200 [HNOI2009]有趣的数列--洛谷luogu

    ---恢复内容开始--- 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3& ...

  5. 在Winform开发中使用FastReport创建报表

    FastReport.Net是一款适用于Windows Forms, ASP.NET和MVC框架的功能齐全的报表分析解决方案.可用在Microsoft Visual Studio 2005到2015, ...

  6. Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)

    前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...

  7. storm自定义分组与Hbase预分区结合节省内存消耗

    Hbas预分区 在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗. ...

  8. 【开源】小程序、小游戏和Web运动引擎 to2to 发布

    简单轻量跨平台的 Javascript 运动引擎 Github → https://github.com/dntzhang/cax/tree/master/packages/to Simple DEM ...

  9. LeetCode 961. N-Repeated Element in Size 2N Array

    In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is repeate ...

  10. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 访问记录功能改进

    当用户数据非常庞大时需要一个功能,就是统计各种账户的访问系统的情况,用户数量的各种参数需要让管理者心里有个数. 1:信息系统中有多少有效账户?可以很方便能知道具体个数,让管理者心里有个数. 2:某个公 ...