【网学网提醒】:网学会员鉴于大家对十分关注,论文会员在此为大家搜集整理了“Android开发简单教程”一文,供大家参考学习
echo2600(
网学)贡献
目录介绍
环境搭建
AndroidSDK安装
安装AVD创建
ADT
目录结构以Android项目的创建目录结构以及各文件作用
AndroidAndroid
项目创建目录结构及文件作用
Android应用解析
Android资源文件解析Android主
程序解析
Android生命周期Android调用webservice
1.环境搭建
在已经安装jdk并且有eclipse前提下安装AndroidSDK和ADT
AndroidSDK安装:
1.首先下载SDK文件(有以下几个
下载地址).Windows版dl.google/android/android-sdk_r06-windows.zipLinux版dl.google/android/android-sdk_r06-linux_86.tgzMac版dl.google/android/android-sdk_r06-mac_86.zip2.解压文件,运行里面的“SDKManager.exe”.解压文件,运行里面的“”
如果你遇到了消息为“Failed如果你遇到了消息为“FailedtofetchURL…”的错误提示
1)在“AndroidSDKandAVDManager”窗口的左侧选择“Settings”2)选中“Forcehttps://…”这个选项
3)点击“SaveandApply”并重新运行SDKSetup.exe3.选择你要安装的API版本、驱动、文档.版本、驱动、
1)如果你只要尝试一下Android2.1Emulator那么你只选择“SDKPlatformAndroid2.1.API7,revision1”来安装就可以了2)如果你要在此SDK上开发应用程序和游戏应用,那么你需要接受并遵守所有许可内容(AcceptAll)3)点击“InstallSelected”4.然后就是等待安装
程序下载选择的包来安装.“InstallingArchives”窗口
ADT安装:
1.打开eclipse.Software”2.点击Add……按钮,弹出对话框输入Name和Location,.按钮,按钮,Location输入:https://dl-ssl.google/android/eclipse/输入:IDE,进入菜单中的“Help”->”InstallNew进入菜单中的“进入菜单中的”
如果不好用就改为dl-ssl.google/android/eclipse/3.确定返回后,在workwith后的下拉列表中选择我们刚才添加.确定返回后,的ADT,我们会看到下面出有DeveloprTools,展开它会有AndroidDDMS和AndroidDevelopmentTool,勾选他们,然,勾选他们,后按照提示一步一步next
完成之后:完成之后:1)选择Window>Preferences……2)在左侧面板选择Android,然后在右侧点击Browse…并选中SDK路径3)点击Apply。OK配置完成
创建:AVD创建:
应用程序可以在模拟器上运行,为使Android应用
程序可以在模拟器上运行,必须创建AVD1)在Eclipse中,选择Window>AndroidSDKandAVD
Manager2)点击左侧面板的VirtualDevices,再点击右
侧的New输入一
个AVD名称,选择一个Target,输入模拟的SDCard的容量大小,选择一个外观皮肤Skin,点击CreateAVD的创建3)运行新建的模拟器AVD即可完成
a.在列表里选择新建的要运行的模拟器(VirtualDevice)b.单击“Start…”c.单击“Launch”
注意:注意:如果点击左侧面板的VirtualDevices,再点击右侧的New,而target下拉列表没有可选项时,点击面板左侧的AvailablePackages,在右侧勾选https://dl-ssl.google/android/repository/repository.xml
然后点击InstallSelected按钮,然后按照提示做就行了
2.Android项目的创建目录结构及各文件作用
项目创建:Android项目创建:
打开file—new--AndroidProject
BuildTarget:选择sdk的版本Applicationname:一个易读的标题在你的应用程序上Packagename:包名,遵循Java规范,用包名来区分不同的类是很重要的CreateActivity:项目的主类名,这个类将会是Android的Activity类的子类。一个Activity类是一个简单的启动程序和控制
程序的类。它可以根据需要创建界面,但不是必须的
目录结构及文件作用:Android目录结构及文件作用:
1.Android目录结构.
src目录—-存放源代码文件gen目录—-ADT插件生成的文件,一般不作修改assets目录—-存放资源文件目录,不会在R.java中生成IDres目录—-存放资源文件目录,这里面的每个文件AndroidManifest.xml整个应用程序配置文件,存储一些包名版本号程序图标
程序标签default.properties检查版本文件,自动生成,不能修改(修改将被删除)
2.重点目录及文件.res/drawable-xxxx是存放
图片的目录drawable-hdpi存放高分辨率版本drawable-ldpi存放中分辨率版本drawable-mdpi存放低分辨率版本
res/layout目录存放布局文件(xml文件),每个Activity对应一个XML文件res/value目录存放存储值文件(xml文件)R.java文件drawable类给
图片生产的IDlayout类给布局文件生成的IDstring类给string.xml里面键值对生成的ID
main.xml控制Activity中控件的位置,每个Activity对应一个此布局文件string.xml存放键值对,一般用在
程序的多语言版本的切换(多个文件,键一样,值不同)
在项目上右键runas>AndroidApplication
程序就运行了
3.Android应用解析
资源文件解析:资源文件解析:
样例,AndroidManifest.xml样例,代码如下
AndroidManifest.xml解析
manifest根节点,描述了package中所有的内容包含命名空间的声明。xmlns:android=schemas.xmlns:androidandroid/apk/res/android,使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据声明应用程序包
Package
application
android:iconandroid:label
Activity
android:nameandroid:label
intent-filter
actioncategory
uses-permission
uses-sdk
包含package中application级别组件声明的根节点。此元素也可包application的一些全局和默认的属性,如标签、icon、主题、必要的权限,等等。一个manifest能包含零个或一个此元素(不能大于一个)应用程序图标应用程序名字用来与用户交互的主要工具。Activity是用户打开一个应用程序的初始页面,大部分被使用到的其他页面也由不同activity所实现,并声明在另外的activity标记中。注意,每一个activity必须有一个标记对应,无论它给外部使用或是只用于自己的package中。如果一个activity没有对应的标记,你将不能运行它。另外,为了支持运行时查找Activity,可包含一个或多个元素来描述activity所支持的操作这个activity对应的类别这个activity的代号声明了指定的一组组件支持的Intent值,从而形成了IntentFilter。除了能在此元素下指定不同类型的值,属性也能放在这里来描述一个操作所需的唯一的标签、icon和其他信息组件支持的Intentaction组件支持的IntentCategory。这里指定了应用程序默认启动的activity应用需要的权限应当在此处申请,所申请的权限应当被系统或某个应用所定义,否则视为无效申请。同时,使用权限的申请需要遵循权限授予条件,非platform认证的应用无法申请高级权限。该应用程序所使用的sdk版本相关
Strings.xml解析
HelloWorld,AndroidTMS!AndroidTMS
这个文件很简单,就定义了两个字符串资源,R.java中对应的索引,与
publicstaticfinalclassstring{publicstaticfinalintapp_name=0x7f040001;publicstaticfinalinthello=0x7f040000;}
String资源的使用
Resourcesr=this.getContext().getResources();Stringappname=((String)r.getString(R.string.app_name));
Stringhello=((String)r.getString(R.string.hello));
AndroidManifest.xml中调用
项目的布局文件layout中资源文件的解析
main.xml
android:layout_marginRight="10dip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="30dip">
与R.java中对应的索引
publicstaticfinalclassdrawable{publicstaticfinalinticon=0x7f020000;}publicstaticfinalclassid{publicstaticfinalintbtnExit=0x7f050002;publicstaticfinalintdataInfo=0x7f050001;publicstaticfinalintusername_view=0x7f050000;}publicstaticfinalclasslayout{publicstaticfinalintmain=0x7f030000;}
layout布局文件的加载
setContentView(R.layout.user_info);setContentView(R.layout.user_info);user_info
layout布局文件中按钮的调用
Buttonbtn=(Button)findViewById(R.id.btnExit);
按钮的监听事件,当用户点击按钮的时候询问用户是否要退出改程序,如果选择是,退出程序,选择否不执行任何操作
btn.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){AlertDialogdlg=newAlertDialog.Builder(ArtistsActivity.this).setTitle("LoginExit").setMessage("您要退出程序??").setPositiveButton("确定",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){finish();}
}).setNegativeButton("取消",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){
}}).create();dlg.show();
}});
程序解析:程序解析:
publicclassAndroidTMSextendsActivity{/**Calledwhentheactivityisfirstcreated.*/publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);TextViewtv=(TextView)findViewById(R.id.dataInfo);TelephonyManagertm=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);Stringimei=tm.getSimSerialNumber();tv.setText(imei+”sim卡号”);Buttonbtn=(Button)findViewById(R.id.btnExit);btn.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){AlertDialogdlg=newAlertDialog.Builder(ArtistsActivity.this).setTitle("LoginExit").setMessage("您要退出程序??").setPositiveButton("确定",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){
finish();}}).setNegativeButton("取消",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){
}}).create();dlg.show();
}});}}
主程序AndroidTMS类继承自TabActivity类,重写了voidonCreate(BundlesavedInstanceState)方法。在onCreate方法中通setContentView(R.layout.main)设置了Activity要显示的布局文件(\layout\main.xml)。程序中的Stringimei=tm.getSimSerialNumber();是读取SIM卡序列号,需要有权限,所以在Androidmani.xml中加入了权限
4.Android生
命周期
activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,可以通过setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的activity(使用ActivityGroup)。大部分的Activity子类都需要实现以下两个接口:onCreate(Bundle)接口是初始化activity的地方.在这儿通常可以调用setContentView(int)设置在资源文件中定义的UI,使用findViewById(int)可以获得UI中定义的窗口.onPause()接口是使用者准备离开activity的地方,在这儿,任何的修改都应该被提交(通常用于ContentProvider保存数据).为了能够使用Context.startActivity(),所有的activity类都必须在AndroidManifest.xml文件中定义有相关的“activity”项。activity类是Android应用生命周期的重要部分。前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:
当设备准备休眠时,当一个Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。Activity的整个生命周期都定义在下面的接口方法中,所有方法都可以被重载。所有的Activity都需要实现onCreate(Bundle)去初始化设置,大部分Activity需要实现onPause()去提交更改过的数据,当前大部分的Activity也需要实现onFreeze()接口,以便恢复在onCreate(Bundle)里面设置的状态。在系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止。Activity有四种本质区别的状态:在屏幕的前台(Activity栈顶)叫做活动状态或者运行状态,(activeorrunning)如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity或者一个透明的Activity被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,
Stopped的Activity将被杀掉。如果一个Activity是Paused或者Stopped状态,系
统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。下面的图显示了Activity的重要状态转换,矩形框表明Activity在状态转换之间的回调接口,可以重载实现以便执行相关代码,带有颜色的椭圆形表明Activity所处的状态。
Activity生命周期
activity生命周期,lifecycle在下图中可以看出,Activity有三个关键的循环:整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。
onStart(),onStop()onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。可见和隐藏之间转换
5.Android调用webservice
android利用ksoap2方式连接webservice,需要导入ksoap2-android-assembly-2.4-jar-with-dependencies.jar包。
Webservice接口:221.2.165.109:108/Service.asmx(在
android当中,不能写localhost,必须写清楚PC机当前的网络IP)
引入ksoap2中以封装好的类
importorg.ksoap2.SoapEnvelope;importorg.ksoap2.serialization.SoapObject;importorg.ksoap2.serialization.SoapSerializationEnvelope;importorg.ksoap2.transport.AndroidHttpTransport;
在类中定义webservice的接口地址以及解析方式并且定义要调用的webservice中的函数privatestaticfinalStringserviceURL="221.2.165.109:108/Service.asmx";privatestaticfinalStringnameSpace="tempuri.org/";privatestaticfinalStringmethodName="getDataSet";StringsoapAction="tempuri.org/getDataSet";接下来开始做对webservice请求数据的工作,请求webservice函数以及封装要用的2个参数(master_no,goodState)SoapObjectrequest=newSoapObject(nameSpace,methodName);request.addProperty("master_no","");request.addProperty("goodState","0");之后我们给定义发送数据的信封的封装格式,发送请求SoapSerializationEnvelopeenvelope=new
SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut=request;envelope.dotNet=truetrue;AndroidHttpTransportht=newAndroidHttpTrans
port(serviceURL);ht.debug=truetrue;ht.call(soapAction,envelope);获取返回数据SoapObjectso=(SoapObject)envelope.getResponse();将得到的so转换成String类型数据StringreturnData=so.toString();ReturnData输出为
anyType{schema=anyType{element=anyType{complexType=anyType{choice=anyType{element=anyType{complexType=anyType{sequence=anyType{element=anyType{};element=anyType{};};};};};};};};diffgram=anyType{NewDataSet=anyType{Table=anyType{B_GOODS_READY=0;MASTER_NO=WDFCGBT140000123;};Table=anyType{B_GOODS_READY=0;MASTER_NO=WDFCGBT140000128;};Table=anyType{B_GOODS_READY=0;MASTER_NO=WDFCGBT140000188;};Table=anyType{B_GOODS_READY=0;MASTER_NO=WDFCGBT140000528;};Table=anyType{B_GOODS_READY=0;MASTER_NO=140900785863;};Table=anyType{B_GOODS_READY=0;MASTER_NO=140900885826;};Table=anyType{B_GOODS_READY=0;MASTER_NO=140900985823;};Table=anyType{B_GOODS_READY=0;MASTER_NO=140900985829;};Table=anyType{B_GOODS_READY=0;MASTER_NO=WDFCGBT150000128;};Table=anyType{B_GOODS_READY=0;MASTER_NO=WDFCGBT150000129;};};};}
处理一下ReturnDataPatternpattern=Patternpile("Table=anyType\\{[^}]*\\};");
Matchermatcher=pattern.matcher(src);Stringitem="";while(matcher.find()){whileSystem.out.println(matcher.group());
Stringstr=matcher.group().replace("Table=anyType{","").replace("","").replace("};","").replace("}","");String[]strlen=str.split(";");if(strlen.length>1){ifStringfir=strlen[0].split("=")[1];Stringsec=strlen[1].split("=")[1];item+=fir+"-"+sec+";";}elseelse{elseStringtempStr=str.split(";")[0].split("=")[1];item+=tempStr+";";}
}输出为
0-WDFCGBT140000123;0-WDFCGBT140000128;0-WDFCGBT140000188;0-WDFCGBT140000528;0-140900785863;0-140900885826;0-140900985823;0-140900985829;0-WDFCGBT150000128;0-WDFCGBT150000129;
项目中添加第三方jar方法:
右击项目名选择BuildPath–>ConfigureBuildPath..->Libraries->Add
ExternalJARS..(选择要加人的jar包)–>OrderandExport选中刚才导入的jar包,然后点击OK,这样的话jar包会一起打包到apk里面
1