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服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动 ...
随机推荐
- Flask 框架 重定向,捕获异常,钩子方法及使用jsonify在网页返回json数据
Flask 框架中常用到重定向方法来实现路由的跳转 ,路由跳转又分为站内跳转和站外跳转 常用的站内跳转方法为url_for 而常用的站外跳转为redirect 在这里提示一下: 在使用两种方法是须调 ...
- mac nginx 启动 自启动
MacBook-Pro:local shihw$ brew services start nginx ==> Tapping homebrew/services Cloning into '/u ...
- nova系列一:虚拟化介绍
一 什么是虚拟化 虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让这多份资源都使用起来,物尽其用,减少了浪费,提高了利用率,省了钱. 虚拟化(Virtualization)技术最早出现在 ...
- Unity热更新学习(一) —— AssetBundle 打包和加载
理论不多说,网上,官方文档都有. 这里有一篇介绍很全面的文章:https://www.cnblogs.com/ybgame/p/3973177.html 示例和注意点记录一下,用到时以便查阅. 一. ...
- Mysql数据库表被锁定处理
1.查进程,查找被锁表的那个进程的ID show processlist; command 为waitting的就是锁住的表,info为执行某条语句的信息,id为进程. 2.kill掉锁表的进程ID ...
- 有关Web常用字体的研究?
Windows自带字体: 黑体:SimHei 宋体:SimSun 新宋体:NSimSun 仿宋:FangSong 楷体:KaiTi 仿宋GB2312:FangSongGB2312 楷体GB2312:K ...
- 一起学习造轮子(二):从零开始写一个Redux
本文是一起学习造轮子系列的第二篇,本篇我们将从零开始写一个小巧完整的Redux,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Promises/A+,Red ...
- SAI窗口无法移动
昨天开SAI遇到了一个很奇怪的问题,改变了双屏的位置后SAI的窗口不能移动两边也有黑边,貌似是这样,标题栏只能进行上下改变窗口大小,不能移动窗体 问题是这样出现的:把任务栏解除锁定拖到侧边就会这样 解 ...
- 03 Django REST Framework 视图和路由
01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...
- 使用Charles对iPhone进行Http(s)请求拦截(抓包)
首先准备工具 1> Charles (下载对应操作系统的安装包进行安装,本文使用 macOS 进行演示) 2> iPhone (本文使用SE,系统版本:iOS 10) 开始 首先,对Cha ...