导航:首页 > 操作系统 > android开发简单实例

android开发简单实例

发布时间:2024-10-08 01:05:06

⑴ 怎样在NetBeans上搭建android开发环境

方法如下:

第一步:安装插件

启动Netbeans,在工具——插件——设置面板卖枝点击“添加”插件

第二步:设置Netbeans中的Android SDK路径

未下载SDK可以直接点击Download Android SDK进行下载,解压到了C盘根目录:

第三步:创建Android虚拟设备

打困闹开汪配罩Netbeans工具——AVD Manager

第四步:创建第一个Android项目

创建新项目,在类别中选择Android——Android Project

点击完成,第一个项目创建完毕

⑵ 如何在Android上编写高效的java代码

Java平台一般有三个版本:Java ME(微型版,用于某些手机)、Java SE(标准版,用于台式电脑)、Java EE(企业版,用于服务器端应用)。在谈到Java时,我们通常是指Java SE,因为只有这个版本包含虚拟机和编译器。

首先,Java代码会被编译成称为字节码的中间格式。当字节码在目标电脑上运行时,虚拟机会快速将它解析成目标电脑硬件和操作系统所需要的本机格式。

除了为开发者提供“一次编写,到处运行”的优势,Java还能通过垃圾回收器(GC)实现自动内存管理,开发者可免去手动在代码中释放无用对象的内存。虽然这个功能非常有用,且大大降低了在代码中引入内存问题的风险,但是它会增加运行时的开销,因为需要不停地执行垃圾回收进程。

本文开头将比较Java SE和用于Android开发的Java之间的差异。首先我会介绍开发者习惯的Java
SE语言结构以及它们是如何在Android上运行的。其次,我会介绍如何优化Android中的Java代码,如何优化内存分配,以及如何恰当地处理多线程。

比较Android上的Dalvik Java和Java SE

虽然远在Android出现之前,开发者就能用Java编程语言为移动设备编写应用程序,但它只是Java中功能极为有限的一个版本,称为Java
ME(微型版)。不同的移动设备还需编写不同的代码,因此,写一个应用程序就能在支持Java
ME的任何手机上运行是几乎不可能的。此外,由于当时不存在很好的在线商店,应用发布过程极其复杂。

Android的问世为开发者提供了构建智能手机强大应用的机会,开发者只需用Java编程语言以及他们熟知的标准Java
API编写代码。然而,尽管Android开发者仍使用Java SE编译器来编译应用程序,你会发现,James
Gosling开发的Java和Android设备上的Java存在许多不同之处。

在Android设备上运行的VM(虚拟机)称为Dalvik。它最初由谷歌的Dan
Bornstein开发,适用于CPU和内存受限的移动设备。Java SE和Dalvik Java存在一些差异,主要体现在虚拟机上。Java
SE使用了栈机设计,而Dalvik被设计成了基于寄存器的机器。Android SDK中有一个dx工具,它会把Java
SE栈机器的字节码转换成基于寄存器的Dalvik机器字节码,该转换步骤由IDE自动完成。

基于栈的虚拟机和基于寄存器的虚拟机的定义以及差异将不列入我们的讨论范围。由于历史原因,Android使用基于寄存器的虚拟机。虽然基于寄存器的虚拟机最多可以比基于栈的虚拟机快32%,但这只限于执行时解释字节码的虚拟机(也就是说,解释型虚拟机)。在Android
2.2版本(也称为Froyo)之前,Dalvik虚拟机都是纯解释型的。Froyo版本引入了JIT编译器(即时编译),这是Java
SE很早就有的一个优势。

JIT编译,也称为动态翻译。它在执行前把字节码翻译成本机代码(如图1所示),这样主要有两个好处。首先,它消除了那些纯解释型虚拟机的开销;其次,它能对本机代码执行优化,这通常是静态编译代码无法做到的。例如,JIT编译器可以在它运行的CPU上选择最合适的优化,也可以根据应用程序的输入来分析代码是如何运行的,以便进行下一步的优化。

图1Android Java和Java SE翻译步骤

虽然Android的Dalvik JIT编译器有很大的发展前景,但要达到如Java SE的JIT编译器般稳定、成熟度尚需很长一段时间。不过,Dalvik JIT的出现为Android提供了巨大的性能优势,而且它也在不断得以改善。

JAVA
SE虚拟机和Dalvik虚拟机的另一个区别是,后者进行了优化,可运行在同一个机器上的多个实例中。它在开机时会启动一个叫做zygote的进程,该进程会创建第一个Dalvik实例,由这个实例创建所有其他的实例。当应用程序启动时,zygote进程会收到一个创建新虚拟机实例的请求,并给该应用程序创建一个新进程(如图2所示)。如果开发者已习惯于Java

SE开发,这样的设计可能看起来不切实际,但它有一个很大的优势,可以避免由一个应用程序运行失败导致Dalvik虚拟机崩溃,继而引发多应用程序崩溃。

图2在Android中启动新Dalvik虚拟机实例

Android和Java
SE除了运行的虚拟机不同之外,它们实现API的方式也不一样。Android中属于java和javax包中的API都来自Apache
Harmony(这是一个开源项目,旨在重新实现Java SE软件栈,该项目从2011年11月不再维护)。在开发方面,这些API和Java
SE包中的类似,但也存在一些差别。例如,谷歌对HttpUrlConnection类进行了Java SE版本中所没有的重大升级。

此外,Android平台移除了Java
SE中无关的API。例如,Swing/AWT包被完全移除,因为Android使用不同的UI框架。其他被移除的API还有RMI、CORBA、ImageIO和JMX。它们或者被替换为特定的Android版本(在android包空间内),或者因为一些实际原因根本不存在。

优化Android上的Java代码

经过多年的改进,Java
SE具备了一些简化编写复杂代码结构的新特性。其中的一些特性会让整个流程变得更简单,但开发者需要了解何时以及如何正确地使用它们。另外,由于Java

SE大多用于服务器端开发(使用Java企业版的API),因而开发人员专门对服务器端Java代码进行了优化。注解和Java虚拟机对脚本语言的支持就是对服务器端开发进行优化的例证。虽然这些工具在构建后端开发时很强大,但在开发Android客户端代码时,这些特性的作用很小,甚至起反作用。Java开发者已经习惯于无限量的RAM和CPU,而Android开发需要密切关注性能和内存分配。简单地说,开发者需要使用稍微不同的方法对待Android和后端的开发。

然而,随着Android的首次发布,情况有所改变。曾经一些在Android上尽量不用的Java规范重新被推荐,这主要因为Android目前的JIT编译器解决了这些规范导致的性能问题。

本文将讨论编写Android应用程序需要了解的Java代码。我们不会深究Java编程语言的细节,而是重点关注对Android开发重要的东西。不过,开发者仍需了解,大多数适用于Java SE的规则和建议同样适用于Android和Dalvik虚拟机。

Android上的类型安全枚举

Java SE 5.0新增了许多方便开发者的新特性。其中最值得期待的是引入了类型安全枚举。枚举在代码中用来表示属于某一组的几个选择。在早期版本的Java中,可以用多个整型常量解决这个问题。虽然这在技术上可行,但是很容易出错。请看下面的代码:
public class Machine {
public static final int STOPPED = 10;
public static final int INITIALIZING = 20;
public static final int STARTING = 30;
public static final int RUNNING = 40;
public static final int STOPPING = 50;
public static final int CRASHED = 60;
private int mState;

public Machine() {
mState = STOPPED;
}

public int getState() {
return mState;
}

public void setState(int state) {
mState = state;
}
}

问题是,虽然这些常量是期望的,但是没有机制保证setState()方法接收不同的值。如果要在设置方法中添加检查,那么一旦得到的是非预期值,开发者就需要处理错误。开发者所需要的是在编译时检查非法赋值。类型安全的枚举解决了这个问题,如下所示:
public class Machine {
public enum State {
STOPPED, INITIALIZING, STARTING, RUNNING, STOPPING, CRASHED
}
private State mState;

public Machine() {
mState = State.STOPPED;
}

public State getState() {
return mState;
}

public void setState(State state) {
mState = state;
}
}

注意在声明不同类型安全值的地方新加的内部枚举类。这在编译时就会解决非法赋值的问题,所以代码更不容易出错。

如果Dalvik虚拟机还没有JIT编译器优化代码,不建议在Android平台上使用枚举类型,因为和使用整型常量相比,这种设计带来的内存和性能损失更大。这就是为什么在一些老版本的Android

API中还存在如此多的整型常量的原因。如今有了更强的JIT编译器以及一个不断改进的Dalvik虚拟机,开发者不必再担心这个问题,放心大胆地使用类型安全枚举即可。

然而,仍然存在一些情况使用整型常量是更好的选择。像int这样的Java基本类型,不会增加GC的开销。此外,Android SDK中许多已有的API仍然依赖基本类型,比如Handler类——在这种情况下,你没有太多的选择。

Android中增强版的for循环

Java SE 5.0还引入了增强版的for循环,提供了一个通用的缩写表达式来遍历集合和数组。首先,比较以下五种方法:
void loopOne(String[] names) {
int size = names.length;
for (int i = 0; i < size; i++) {
printName(names[i]);
}
}

void loopTwo(String[] names) {
for (String name : names) {
printName(name);
}
}

void loopThree(Collection<String> names) {
for (String name : names) {
printName(name);
}
}

void loopFour(Collection<String> names) {
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
printName(iterator.next());
}
}

// 不要在ArrayList上使用增强版的for循环
void loopFive(ArrayList<String> names) {
int size = names.size();
for (int i = 0; i < size; i++) {
printName(names.get(i));
}
}

上面显示了四种不同遍历集合和数组的方式。前面两种有着相同的性能,所以如果只是读取元素的话,可以放心地对数组使用增强版for循环。对Collection对象来说,增强版for循环和使用迭代器遍历元素有着相同的性能。ArrayList对象应避免使用增强版for循环。

如果不仅需要遍历元素,而且需要元素的位置,就一定要使用数组或者ArrayList,因为所有其他Collection类在这些情况下会更慢。

一般情况下,如果在读取元素几乎不变的数据集时对性能要求很高,建议使用常规数组。然而,数组的大小固定,添加数据会影响性能,所以编写代码时要考虑所有因素。

队列、同步和锁

通常情况下,应用程序会在一个线程中生产数据,在另一个线程中使用它们。常见的例子是在一个线程中获取网络上的数据,在另一个线程(操作UI的主线程)中把这些数据展现给用户。这种模式称为生产者/消费者模式,在面向对象编程课程中,开发者用算法来实现该模式可能要花上几个小时。下面会介绍一些简化生产者/消费者模式实现的现成类。

1. 更智能的队列

虽然已有现成的类并能用更少的代码实现该功能,但许多Java开发者仍然选择使用LinkedList以及同步块实现队列功能。开发者可在java.util.concurrent包中找到同步相关的类。此外,本包还包含信号量、锁以及对单个变量进行原子操作的类。考虑下面使用标准的LinkedList实现线程安全队列的代码。
public class ThreadSafeQueue {
private LinkedList<String> mList = new LinkedList<String>();
private final Object mLock = new Object();

public void offer(String value) {
synchronized (mLock) {
mList.offer(value);
mLock.notifyAll();
}
}

public synchronized String poll() {
synchronized (mLock) {
while (mList.isEmpty()) {
try {
mLock.wait();
} catch (InterruptedException e) {
//简洁起见忽略异常处理
}
}
return mList.poll();
}
}
}

虽然这段代码是正确的,并有可能在考试中得满分,但实现和测试这样一段代码只是在浪费时间。实际上,所有前面的代码可用下面一行代替。
LinkedBlockingQueue<String> blockingQueue =
new LinkedBlockingQueue<String>();

上面的一行代码能像前面的例子一样提供相同类型的阻塞队列,甚至能提供额外的线程安全操作。java.util.concurrent包含许多可选的队列以及并发映射类,所以,一般情况下,建议使用它们,而不是像之前的示例那样使用更多代码。

2. 更智能的锁

Java提供的synchronized关键字允许开发者创建线程安全的方法和代码块。synchronized关键字易于使用,也很容易滥用,对性能造成负面影响。当需要区分读数据和写数据时,synchronized关键字并不是最有效的。幸好,java.util.concurrent.locks包中的工具类对这种情况提供了很好的支持。
public class ReadWriteLockDemo {
private final ReentrantReadWriteLock mLock;
private String mName;
private int mAge;
private String mAddress;

public ReadWriteLockDemo() {
mLock = new ReentrantReadWriteLock();
}

public void setPersonData(String name, int age, String address) {
ReentrantReadWriteLock.WriteLock writeLock = mLock.writeLock();
try {
writeLock.lock();
mName = name;
mAge = age;
mAddress = address;
} finally {
writeLock.unlock();
}
}

public String getName() {
ReentrantReadWriteLock.ReadLock readLock = mLock.readLock();
try {
readLock.lock();
return mName;
} finally {
readLock.unlock();
}
}

// 重复代码不再赘述
}

上面的代码展示了在什么地方使用ReentrantReadWriteLock,它允许多个并发线程对数据进行只读访问,并确保同一时间只有一个线程写入相同的数据。

在代码中使用synchronized关键字仍然是处理锁问题的有效方法,但无论何种情况下,都要考虑ReentrantReadWriteLock是否是

⑶ 如何在visual studio开发android程序

使用Xamarin在Visual Studio中开发Android应用
本文使用的环境是Windows 8 Visual Studio 2012.2

1.下载Xamarin

2.安装Xamarin
下载后运行EXE文件
之后经过一些必要的下一步
想要开发Android,Android肯定是要勾选了,IOS看心情

自己添加Android SDK路径

注意关闭已经打开的Visual Studio实例
之后就开始了各种安装和下载

10分钟过去。。。安装完成
3.配置Android SDK环境变量
注意这里的操作,找到自己的Android-SDK的安装目录,添加一个环境变量
ANDROID_SDK_HOME=D:\Program Files (x86)\adt-bundle-windows-x86_64-20130219\sdk
另外,还需要在Path中添加
%ANDROID_SDK_HOME%/tools;%ANDROID_SDK_HOME%/platform-tools;注意,是2条(如果已经打开了Visual Studio那需要重起Visual Studio才能生效)
4.新建Android项目
打开Visual Studio,我们就能看到这些Android项目了,来,新建一个

新建的时候会跳出授权信息

如果想试用请点试用,或者输入一个License或使用Xamarin账号都可以
如果使用Xamarin账号会直接跳转到Xamarin做授权

授权后不要关闭页面要多等一会,然后VS会做提示,之后重启VS,授权成功,项目列表自然显示

点击Debug,出现选择模拟器界面,这里选择Start emulator image

之后创建一个新的emulator image

之后建立一个模拟器;或者注意到Device Definitions 标签下去用模板建立一个也OK;新建后点击Start

模拟器就运行起来就算是大功告成。

这时在选择设备中就可以选择相应设备

再经过一段时间的等待程序就已经可以运行了,我也也可以去测试默认的模板建立的点击的程序

⑷ android怎么用paint实现图像的渐变出现

在android.graphics中提供了有关Gradient字样的类,例如LinearGradient线性渐变、 RadialGradient径向渐变和SweepGradient角度渐变三种,他们的基类为android.graphics.Shader。为了演 示图像渐变效果,下面给出一个简单的实例。

一、LinearGradient线性渐变
在android平台中提供了两种重载方式来实例化该类分别为,他们的不同之处为参数中第一种方法可以用颜色数组,和位置来实现更细腻的过渡效果, 比如颜 色采样int[] colors数组中存放20种颜色,则渐变将会逐一处理。而第二种方法参数仅为起初颜色color0和最终颜色color1。

LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)

LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)

使用实例如下:

Paint p=new Paint();
LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR); //参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点,最后参数为平铺方式,这里设置为镜像
刚才已经讲到Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变,代码如下:

p.setShader(lg);
canvas.drawCicle(0,0,200,p); //参数3为画圆的半径,类型为float型。
二、RadialGradient镜像渐变
有了上面的基础,我们一起来了解下径向渐变。和上面参数唯一不同的是,径向渐变第三个参数是半径,其他的和线性渐变相同。

RadialGradient(float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)

RadialGradient(float x, float y, float radius, int color0, int color1, Shader.TileMode tile)

三、SweepGradient角度渐变
对于一些3D立体效果的渐变可以尝试用角度渐变来完成一个圆锥形,相对来说比上面更简单,前两个参数为中心点,然后通过载入的颜色来平均的渐变渲染。

SweepGradient(float cx, float cy, int[] colors, float[] positions) //对于最后一个参数SDK上的描述为May be NULL. The relative position of each corresponding color in the colors array, beginning with 0 and ending with 1.0. If the values are not monotonic, the drawing may proce unexpected results. If positions is NULL, then the colors are automatically spaced evenly.,所以建议使用下面的重载方法,本方法一般为NULL即可。

SweepGradient(float cx, float cy, int color0, int color1)

到此,希望大家对图像特效处理有了一定的认识,了解这些对打好Android游戏开发的基础很有好处。
转载

⑸ 求一个android实例,跟随手指的小球,要详细!!!!!!

这是我之前写的一个按钮跟随手指的,你可以看下,界面的话很简单,就一个按钮,主要是通过Activity本身自带的事件来实现的。

package com.chapter4;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.AbsoluteLayout;
import android.widget.Button;

public class Activity2 extends Activity{
/** Called when the activity is first created. */
final static int WRAP_CONTENT=-2;//表示WRAP_CONTENT的常量
final static int X_MODIFY=4;//在非全屏模式下X坐标的修正值
final static int Y_MODIFY=52;//在非全屏模式下Y坐标的修正值

int xSpan;//在触控笔点击按钮的情况下相对于按钮自己坐标系的
int ySpan;//X,Y位置
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2_main);
Button bok=(Button)this.findViewById(R.id.Button01);
bok.setOnTouchListener(
new OnTouchListener()
{
public boolean onTouch(View view, MotionEvent event) {
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN://触控笔按下
xSpan=(int)event.getX();
ySpan=(int)event.getY();
break;
case MotionEvent.ACTION_MOVE://触控笔移动
Button bok=(Button)findViewById(R.id.Button01);
//让按钮随着触控笔的移动一起移动
ViewGroup.LayoutParams lp=
new AbsoluteLayout.LayoutParams
(
WRAP_CONTENT,
WRAP_CONTENT,
(int)event.getRawX()-xSpan-X_MODIFY,
(int)event.getRawY()-ySpan-Y_MODIFY
) ;
bok.setLayoutParams(lp);
break;
}
return true;
}
}
);
}

@Override
public boolean onKeyDown (int keyCode, KeyEvent event)
{//键盘键按下的方法
Button bok=(Button)this.findViewById(R.id.Button01);
bok.setText(keyCode+" Down");
return true;
}

@Override
public boolean onKeyUp (int keyCode, KeyEvent event)
{//键盘键抬起的方法
Button bok=(Button)this.findViewById(R.id.Button01);
bok.setText(keyCode+" Up");
return true;
}

public boolean onTouchEvent (MotionEvent event)
{
//让按钮随着触控笔的移动一起移动
Button bok=(Button)this.findViewById(R.id.Button01);
ViewGroup.LayoutParams lp=
new AbsoluteLayout.LayoutParams
(
WRAP_CONTENT,
WRAP_CONTENT,
(int)event.getRawX()-xSpan-X_MODIFY,
(int)event.getRawY()-ySpan-Y_MODIFY
) ;
bok.setLayoutParams(lp);
return true;
}
}

阅读全文

与android开发简单实例相关的资料

热点内容
录音笔如何修改文件夹 浏览:641
八爪鱼数据采集加密文字替换 浏览:84
android系统运行动态编译的程序 浏览:417
计算编程中常用的if语句是 浏览:736
linux文件夹权限乱了 浏览:910
程序员职业病预防保健操 浏览:680
c程序修改后需不需要重新编译 浏览:725
怎样把图片分别放置在文件夹中 浏览:873
推流服务器地址是什么 浏览:632
java允许多重继承 浏览:513
解压小玩具好玩又可爱 浏览:408
腾讯云大带宽服务器 浏览:823
加密锁的售后 浏览:268
linux登不上去 浏览:731
联想服务器休眠后如何唤醒 浏览:113
四川话女孩学习编程 浏览:324
编译原理文法区分 浏览:1001
教师可以做程序员嘛 浏览:637
终结战场安卓国际服怎么下载 浏览:155
现在的高端服务器属于什么 浏览:810