Java ME之Android开发从入门到精通
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开发从入门到精通的更多相关文章
- android 开发从入门到精通
Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...
- Android 学习资料入门到精通(PDF集合)共54本
最近收集一些安卓入门到精通,包含游戏编程,网络编程,多媒体开发,需要学习朋友就下载保持下来,下载链接在最下面 下面是网盘内容 14天学会安卓开发_(完整版).pdf Android 4 游戏高级编程 ...
- 学Android开发,入门语言java知识点
学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...
- 「Android 开发」入门笔记
「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...
- 使用Ant搭建Android开发环境入门
使用Ant搭建Android开发环境入门 使用Ant搭建Android开发环境,建立android项目 配置Ant环境 下载Ant:http://ant.apache.org/bindownloa ...
- 2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构 班级: 1623 姓名: 齐力锋 学号: 20162326 成绩: 指导教师: 娄嘉鹏/王志强 实验日期: 2017年5 ...
- 《Java 开发从入门到精通》—— 2.3 使用IDE工具序
本节书摘来异步社区<Java 开发从入门到精通>一书中的第2章,第2.3节,作者: 扶松柏 , 陈小玉,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.3 使 ...
- Nginx开发从入门到精通 学习目录分享学习 (阿里著作)
Nginx开发从入门到精通 缘起 nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部 ...
- C# Windows服务开发从入门到精通
一.课程介绍 大家都知道如果想要程序一直运行在windows服务器上,最好是把程序写成windows服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动 ...
随机推荐
- P2080 增进感情(背包DP)
思路:将好感度x+y作为体积, 幸福度x-y作为作为价值, 然后就是一个经典的背包问题了.emmmmm,还可以特判一下,因为幸福度为0时就是最小了,没有必要看后面的了吧. 其实,我自己做的时候,沙雕的 ...
- 05 python 初学(列表)
列表,有点像c++里的数组 # _author: lily # _date: 2018/12/16 mylist = ["xiaohong", "xiaogang&quo ...
- hdu4966 GGS-DDU
hdu4966 GGS-DDU 有 \(n\) 个课程,每种课程有 \(a_i\) 级,一开始你每种课程都为 \(0\) 级,有 \(m\) 个升级方案:\((x,\ l1,\ y,\ l2,\ c) ...
- ind2sub
ind2sub 线性索引的下标 语法 [I,J] = ind2sub(siz,IND)[I1,I2,I3,...,In] = ind2sub(siz,IND) 说明 ind2sub 函数确定与数组 ...
- Egg入门学习(二)---理解service作用
在上一篇文章 Egg入门学习一 中,我们简单的了解了Egg是什么东西,且能做什么,这篇文章我们首先来看看官网对Egg的整个框架的约定如下,及约定对应的目录是做什么的,来有个简单的理解,注意:我也是按照 ...
- kali 源
#阿里云 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.al ...
- 深入浅出Redis05-Redis集群环境的配置
一.安装redis 1,下载redis最新版 从以下redis地址下载最新版本的redis,使用使用redis-3.2.9.tar版本. http://download.redis.io/releas ...
- WPF效果(GIS二维篇)
距离上次发东西已经过去了貌似不知多少天了,突然发现自己懒得总结了.这毛病感觉不好,还得写点东西来充实一下自己,不然这样整天浑浑噩噩的过日子,也太平淡了,不管怎么说,起码得给自己的经历留下点东西吧.闲话 ...
- 01-HTML介绍
1.WEB标准 web准备介绍: w3c:万维网联盟组织,用来制定web标准的机构(组织) web标准:制作网页遵循的规范 web准备规范的分类:结构标准.表现标准.行为标准. 结构:html.表示: ...
- 1060E Sergey and Subway(思维题,dfs)
题意:给出一颗树,现在,给哪些距离为2的点对,加上一条边,问所有点对的距离和 题解:如果没有加入新的边,距离和就会等于每条边的贡献,由于是树,我们用点来代表点上面的边,对于每条边,它的贡献将是(子树大 ...