《Android程序设计Activity谷风详析》由会员分享,可在线阅读,更多相关《Android程序设计Activity谷风详析(95页珍藏版)》请在金锄头文库上搜索。
1、Android: Activity武汉科技大学计算机学院武汉科技大学计算机学院七月七月 24嵌入式系统开发与设计嵌入式系统开发与设计Activity简介简介Android核心组件:ActivitypActivityu活动uAndorid组件中最基本也是最为常见用的组件u在Android应用中,一个Activiy通常就是一个单独的屏幕u每个Activity都被实现为一个从活动积累继承来的独立的类u活动类显示的用户接口由视图控件组成,并对事件做出响应pActivity是Android应用程序的表示层u使用View来构成显示信息和响应用户动作的UIu可以看做是开发环境中的Formu应用程序越复杂,需
2、要的屏幕可能越多3特制分析Activity的创建与使用的创建与使用Activity的创建和使用p创建Activityu在Activity类的基础上进行扩展u在Activity中定义UI并实现其功能p基本Activity类提供了封装了窗口显示处理功能的空白屏幕u交互和显示还需要进行设计pActivity的注册u应用程序中的Activity需要在AndroidManifest.xml中进行注册u没有对应标签的Activity不能被启动5特制分析Activity的创建和使用(2)p在android.app.Activity类中,Android定义了一系列方法u在应用程序中通过对这些方法的复写来完成对
3、Activity的创建和使用upublicclassOurActivityextendsActivityprotectedvoidonCreate(BundlesavedInstanceState);protectedvoidonStart();protectedvoidonReStart();protectedvoidonResume();protectedvoidonPause();protectedvoidonStop();protectedvoidonDestroy();6特制分析Activity的创建和使用(3)pprotectedvoidonCreate(BundlesavedIn
4、stanceState)u一个Activity的实例被启动时调用的第一个方法u一般都会覆盖该方法作为应用程序的一个入口点p完成一些初始化数据、设置用户界面等工作u大多数情况下,在该方法中从xml中加载设计好的用户界面。p例如setContentView(R.layout.main);u也可从savedInstanceState中读取保存到存储设备中的数据p需要判断savedInstanceState是否为null,因为Activity第一次启动时并没有数据被存贮在设备中uif(savedInstanceState!=null)savedInstanceState.get(Key);7特制分析A
5、ctivity的创建和使用(4)pprotectedvoidonStart()u在onCreate()方法之后被调用,或者在Activity从Stop状态转换为Active状态时被调用pProtectedvoidonReStart()u在Activity被停止后调用pprotectedvoidonResume()u在Activity从Pause状态转换到Active状态时被调用8特制分析Activity的创建和使用(5)pprotectedvoidonPause()u在Activity从Active状态转换到Pause状态时被调用u必要时也需要保存状态和数据pprotectedvoidonSt
6、op()u在Activity从Active状态转换到Stop状态时被调用u一般在这里保存Activity的状态信息pprotectedvoidonDestroy()u在Activity被结束时调用,它是被结束时调用的最后一个方法u一般完成释放资源,清理内存等工作9特制分析HelloWorld!pJava文件-应用程序源文件uandroid本身相当一部分都是用java编写而成uandroid的应用使用java来开发pClass文件-Java编译后的目标文件uGoogle使用Dalvik来运行应用程序uAndroid的class文件是编译过程中的中间目标文件,需要链接成dex文件才能在Dalvik
7、上运行10特制分析HelloWorld!(2)pDex文件-Android平台上的可执行文件uAndroid虚拟机Dalvik支持的字节码文件格式pApk文件-Android上的安装文件uApk是Android安装包的扩展名,一个Android安装包包含了与该Android应用程序相关的所有文件uapk文件将AndroidManifest.xml文件、应用程序代码(.dex文件)、资源文件和其他文件打成一个压缩包u一个工程只能打进一个.apk文件uapk文件的本质是一个zip包11特制分析HelloWorld!(3)pEclipse自动生成unewandroidprojectpHelloAnd
8、roid12特制分析HelloWorld!(4)p代码:HelloWorld.javapackage com.myapps.helloworld;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class HelloWorld extends Activity Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentVi
9、ew(R.layout.activity_hello_world); Override public boolean onCreateOptionsMenu(Menu menu) /Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.hello_world, menu); return true; 13特制分析HelloWorld!(5)p一个Activity就是一个类u这个类要继承于Activityp重写onCreate方法upublicv
10、oidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.activity_hello_world);14特制分析HelloWorld!(6)pR.java/* AUTO-GENERATED FILE. DO NOT MODIFY.*/package com.myapps.helloworld;public final class R public static final class attr public static final class dimen p
11、ublic static final int activity_horizontal_margin=0x7f040000; public static final int activity_vertical_margin=0x7f040001; public static final class drawable public static final int ic_launcher=0x7f020000; public static final class id public static final int action_settings=0x7f080000; public static
12、 final class layout public static final int activity_hello_world=0x7f030000; public static final class menu public static final int hello_world=0x7f070000; public static final class string public static final int action_settings=0x7f050001; public static final int app_name=0x7f050000; public static
13、final int hello_world=0x7f050002; public static final class style public static final int AppTheme=0x7f060001; 15特制分析HelloWorld!(7)pactivity_hello_world.xml Resources16特制分析HelloWorld!(8)p每一个Activity都需要在AndroidMainfest.xml中文件当中进行配置up为Activity添加必要的控件u通过findViewById(控件的id);可以得到所要显示的控件p例如取得TextView的控件Te
14、xtViewtextView=(TextView)findViewById(R.id.Test);17特制分析HelloWorld!(9)p布局文件中的属性很多p通过布局文件来定义重要的属性uandroid:layout_widthp宽度uandroid:layout_heightp高度pmatch_parent|wrap_contentuandroid:layout_weight:权重(默认为0)uandroid:idp唯一标识,用于在程序或配置文件中引用18特制分析HelloWorld!(10)pstrings.xml HelloWorld Settings Hello world!将要显
15、示内容:HelloWorld.19特制分析HelloWorld!(11)pRUNRUN20特制分析HelloWorld!(12)21特制分析HelloWorld!(13)22特制分析HelloWorld!(14)pActivity是Android应用程序的用户接口u一个Activity中可以放置很多控件pActivity也可以理解为控件的容器按钮列表文本23特制分析HelloWorld!(15)p模拟器屏幕u最大支持1280*800p10.1”Tablet,WXGAp7.3”Nexus7u最小支持240*320p2.7”QVGA24特制分析HelloWorld!(16)p命令行运行u启动模拟器
16、pemulator-avd2.3scaleauto25特制分析HelloWorld!(17)p命令行运行u连接模拟器ptelnetlocalhost555426特制分析HelloWorld!(18)p命令行运行u拨打电话:pgsmcall1391111008627特制分析HelloWorld!(19)p命令行运行u发送短信:psmssend13811110086HelloWorld28特制分析Android程序结构p/srcuJava源代码存放目录p/genu自动生成目录u存放所有由Android开发工具自动生成的文件29特制分析Android程序结构(2)p/gen/R.javauR.jav
17、a文件由Android开发工具自动产生的uAndroid开发工具会自动根据放入res目录的xml界面文件、图标与常量,同步更新修改R.java文件pR.java文件是由开发工具自动生成的,应避免手工修改R.javauR.java在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的idp通过R.java,应用可以很方便地找到对应资源p另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间30特制分析Android程序结构(3)p/resu资源(Resource)目录u存放应用使用到的各种资源,如xml界面文件,图片或
18、数据31特制分析Android程序结构(4)pres目录下的资源文件u除string之外,还可以定义color,dimensustring-array(子标记为item)u每种资源都需要定义name属性p资源文件放在res/values目录下u可以是单独的文件u可以分类放在不同文件中u文件名任意p资源目录中不能随意创建子目录p布局资源的文件名和图片资源的文件名只允许小写字母和数字32特制分析Android程序结构(5)pres/xml目录u其他资源u任意XML文件,程序中用R.xml.文件名访问pres/raw目录u原始资源u程序中用Resources对象.openRawResource(R.
19、raw.XXX)获得一个输入流u原始资源不会被编译为二进制passetu放入assets目录,系统不会自动生成id,程序中用Resources对象.getAssets().open(文件名)获得输入流uassets目录则可以随意创建子目录33特制分析Android程序结构(6)p对资源的引用u程序中p利用R.资源类型.资源名访问p例如R.layout.mainR.id.abcp或者使用getResources()得到Resources对象,用于将资源的id值转为相应的对象p例如getText,getColor,getDrawableuXML文件中p利用资源类型/资源名访问p例如id/abcp+
20、id/abc表示添加一个id资源“abc”34特制分析Android程序结构(7)pAndroidManifest.xmlu列出了应用程序所提供的功能u可以指定应用程序使用到的服务(如电话服务、互联网服务、短信服务、GPS服务等等)u新添加一个Activity的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此Activityu包括了安全访问权限pproject.propertiesu项目环境信息,一般是不需要修改此文件35特制分析Activity的生命周期的生命周期Activity的生命周期pAndroid应用程序不能控制所拥有进程的生存期uAndroid系统在运行时管理每个应用
21、程序的进程u同样业管理每个进程内的每个活动pActivity的管理u所有的Activity由Android系统的Activity栈管理p当前所有正在运行的进程的后进先出的集合uActivity的状态由它在栈中的位置所决定u一个新的Activity执行后被放置到栈的顶端,变成“runningactivity”,此前的Activity存在于堆栈中,一般不在前景p如果通过“Back”返回此前的Activity或者当前Activity被关闭,栈中的下一个活动变成栈顶活动,并成为活动状态37特制分析Activity的生命周期(2)pActivity的状态uActivity在系统中不断的被创建和销毁u在A
22、ctivity栈中被移进和移出uActivity在不同的状态中转换pActivity的4个状态u活动状态(Active)u暂停状态(Paused)u停止状态(Stop)u非活动状态(Finish/Kill)38特制分析Activity的生命周期(3)pActivity:活动状态u位于Activity栈的栈顶u可见的、focused的前台Activityu处于屏幕的最上层pAndroid系统会尽力维持活动状态Activity的运行u通过适当的销毁其他的Activity来保证活动状态Activity所需的资源u当有某个Activity变为活动状态时,该活动被暂停p处于paused状态39特制分析A
23、ctivity的生命周期(4)pActivity:暂停状态u特定情况下可见但不是焦点的Activityp非全屏或者半透明状态u仍处于近似active的状态p自身的状态和数据都存在p与窗口管理程序保持联系p不能接收用户的输入事件u被系统终止p当系统内存资源不足时会被终止p状态的转变u不可见时转变为停止状态40特制分析Activity的生命周期(5)pActivity:停止状态u当一个Activity被其它的Activity完全的遮盖住时,Activity的状态发生变化u仍保有其状态及数据u已变为不可见,画面是隐藏且不需要更新p停止状态的Activity会被终止u当系统内存不足时,stop状态的A
24、ctivity首先被终止已释放内存p状态的转换uActivity退出或者被关闭41特制分析Activity的生命周期(6)pActivity的终止不受程序员控制u可以通过程序创建和运行Activity,并使用方法停止Activityu终止Activity由Android系统决定p当Activity处于pause或者stop状态时可能被系统终止并回收u应用程序运行过程中的一些状态(用户输入等)需要保存到持久存储中u应用程序中启动了其他后台线程,同样也需要进行处理p否则会失去运行时的状态或输入或者p由于没有处理后台线程导致异常42特制分析Activity的生命周期(7)pActivity状态的转换
25、u除栈顶Activity外均为pause/stop/finish/kill状态u一旦栈顶Activity失去焦点就变为pause/stop/finish/kill状态,同时新的Activity或者栈中的下一个Activity成为栈顶Activityp转换的控制u状态的转换由系统控制,对用户不可见u转换过程中所存储的数据和状态在Activity转换为active状态时就需要进行恢复43特制分析Activity的生命周期(8)完整生命周期完整生命周期可视生命周期可视生命周期前台生命周期前台生命周期44特制分析Activity的生命周期(9)p完整生命周期uActivity的完整生命周期自第一次调用
26、onCreate()方法开始,到调用onDestroy()为止p如果Activity所在的进程被终止,那么即使没有调用onDestroy方法Activity也结束其存在u在onCreate()中设置所有“全局”状态以完成初始化p初始化Activityp扩展(inflate)UIp分配对类变量的引用p将数据绑定到控件p创建服务和线程u在onDestroy()中释放所有系统资源p通过重写来清除,保证所有外部资源被关闭45特制分析Activity的生命周期(10)pActivity的可视生命周期u自onStart()调用开始直到相应的onStop()调用结束u在此期间,用户可以在屏幕上看到Activ
27、ityp可能不是用户关注的活动,或者不与用户进行交互u可以保留用来向用户显示这个Activity所需的资源pActivity的可视生命周期可能多次经历uonStart()和onStop()方法可以随着应用程序是否为用户可见而被多次调用u在可视生命周期内可能被直接销毁,而不调用onStop方法46特制分析Activity的生命周期(11)ponStop方法u用来暂停或者停止动画、线程、计时器、服务或者其他专门用于更新UI的进程uUI不可见时该方法只消耗资源而没有意义ponStart/onReStartu当UI可见时使用这两个方法恢复或者重启进程uonReStart可以实现当Activity在其完
28、整生命周期内重启才能完成的处理ponStart/onStopu也可以用来注册和销毁专门用来更新UI的广播接收器47特制分析Activity的生命周期(12)pActivity的前台生命周期u自onResume()调用起,至相应的onPause()调用为止u在此期间,Activity位于前台最上面并与用户进行交互,接受用户的输入uActivity会经常在暂停和恢复之间进行状态转换p当Activity不被关注或者有新的Activity启动时,将调用onPause()方法p当Activity获得结果或者接收到新的Intent时会调用onResume()方法uonReusme()方法中的代码尽可能的少
29、,以保证切换时的响应速度ponPause()u一般重写来托管未保存的改动u处于pause状态的Activity可能被销毁48特制分析多多Activity的使用的使用Logpandroid.util.Log类的静态方法u查找错误和打印系统日志消息。pLog常用的方法有以下5个:uLog.v(Stringtag,Stringmsg);(VERBOSE)uLog.d(Stringtag,Stringmsg);(DEBUG)uLog.i(Stringtag,Stringmsg);(INFO)uLog.w(Stringtag,Stringmsg);(WARN)uLog.e(Stringtag,Strin
30、gmsg)。(ERROR)50特制分析Log(2)p根据规范建议uLog.v、Log.d信息应当只存在于开发过程中u最终版本只可以包含三种日志信息pLog.ipLog.wpLog.ep实际利用DDMS进行调试u三种日志区别不大u显示的颜色不同51特制分析Log(3)pVuVerbosepDuDebugpIuInfopWuWarnpEuErrorpFuFatalpSuSilent52特制分析Log(4)pLog.v(黑色)u任何消息都会输出,一般用这个进行程序运行状态的输出pLog.i(绿色)u输出提示信息pLog.d(蓝色)u输出Debug信息pLog.w(黄色)u输出警告信息pLog.e(红
31、色)u输出错误信息53特制分析Log(5)54特制分析DDMSpDDMSuDalvikDebugMonitorServiceuIDE、emulator与实际android设备之间通信的桥梁pDDMS的作用u捕捉到终端的ID,并通过adb建立调试器,从而实现发送指令到测试终端的目的u为测试设备截屏u针对特定的进程查看正在运行的线程以及堆信息uLogcatu广播状态信息u模拟电话呼叫u接收SMSu虚拟地理坐标等等55特制分析DDMS(2)p开启DDMS56特制分析DDMS(3)57特制分析音频播放实例p播放音频资源uandroid.media.MediaPlayerp=MediaPlayer.cr
32、eate(Context,R.raw.XXX);p.prepare();p.start();/播放p播放外部音频文件uMediaPlayerp=newMediaPlayer();p.setDataSource(url)/url可以是/sdcard/XXX也可以是网络中的URLp.prepare();p.start();58特制分析音频播放实例(2)android应用开发解密书中第7章代码59特制分析音频播放实例(3)p程序编译通过,运行错误60特制分析音频播放实例(4)pLogCat信息61特制分析音频播放实例(5)62特制分析音频播放实例(6)63特制分析音频播放实例(7)64特制分析音频播
33、放实例(8)65特制分析音频播放实例(9)p将文件发送到设备上66特制分析音频播放实例(10)67特制分析SDCardp在模拟器中使用SDCardu需要先创建一张SDCard卡u创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用命令行方式进行创建:p在命令行窗口中进入androidSDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀建议使用.imgpmksdcard2048MD:sdcard.img68特制分析SDCard(2)p程序中访问SDCardu需要申请访问SDCard的权限u在AndroidManifest.xml的Manifest
34、标签中加入访问SDCard的权限如下p69特制分析SDCard(3)p向SDCard存放文件u程序必须先判断手机是否装有SDCard,并且可以进行读写uif(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)FilesdCardDir=Environment.getExternalStorageDirectory();FilesaveFile=newFile(sdCardDir,“abc.txt”);pandroid.os.Environment.getExternalStorageState()方法u
35、用于获取SDCard的状态u如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于MEDIA_MOUNTEDpEnvironment.getExternalStorageDirectory()方法u用于获取SDCard的目录或者u写成FilesaveFile=newFile(/sdcard/abc.txt);70特制分析SDCard(4)71特制分析SDCard(5)72特制分析SDCard(6)73特制分析SDCard(7)74特制分析SDCard(8)75特制分析SDCard(9)76特制分析MediaPlayer的生命周期p创建u-setDatasourseu-prepare
36、u-startu-pauseu-startu-stopu-releasep调用stop进入停止状态,再播放要先调用prepare再调用start77特制分析MediaPlayer的生命周期(2)78特制分析MediaPlayer的生命周期(3)tryMediaPlayerplayer=newMediaPlayer();player.setDataSource(/sdcard/nx.mp3);player.prepare();player.start();Thread.sleep(15000);player.stop();Thread.sleep(5000);player.prepare();p
37、layer.start();Thread.sleep(20000);player.stop();player.release();catch(Exceptione)e.printStackTrace();79特制分析模拟器来电铃声设定80特制分析模拟器来电铃声设定(2)81特制分析模拟器来电铃声设定(3)p铃声选择为空,所以来电都没有铃声82特制分析将sdcard上某音乐加入铃声publicclassMainActivityextendsActivityprivatestaticfinalStringTAG=LogDemo;OverridepublicvoidonCreate(Bundlesa
38、vedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getmusicfromsdcard();/EmLession+83特制分析将sdcard上某音乐加入铃声(2)privatevoidgetmusicfromsdcard() Stringfilename=/sdcard/ydgqq5.mp3;Filek=newFile(filename);/pathisafileto/sdcardContentValuesvalues=newContentValues();val
39、ues.put(MediaStore.MediaColumns.DATA,k.getAbsolutePath();values.put(MediaStore.MediaColumns.TITLE,“ydggq5”);values.put(MediaStore.Audio.Media.IS_RINGTONE,true);values.put(MediaStore.Audio.Media.IS_NOTIFICATION,false);values.put(MediaStore.Audio.Media.IS_ALARM,false);values.put(MediaStore.Audio.Media
40、.IS_MUSIC,false);84特制分析将sdcard上某音乐加入铃声(3)/InsertitintothedatabaseUriuri=MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath();UrinewUri=getContentResolver().insert(uri,values);tryRingtoneManager.setActualDefaultRingtoneUri(this,RingtoneManager.TYPE_RINGTONE,newUri);catch(Throwablet)Log.d(T
41、AG,“catchexception”);85特制分析设置某音乐为当前铃声86特制分析设置某音乐为当前铃声(2)87特制分析音频采集录音p创建MediaRecorder对象rec(来自android.media包)p开始录音u创建File对象,扩展名为amr,urec.setOutputFile(f.getAbsoulutePath()rec.setAudioSource(MediaRecorder.AudioSource.MIC)/设置声源rec.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT)/输出格式rec.setAudioEncod
42、er(MediaRecorder.AudioEncoder.DEFAULT)/音频格式rec.prepare()rec.start()p结束录音urec.stop()rec.release()rec=nullp权限uandroid.permission.RECORD_AUDIO88特制分析音频采集录音(2)89特制分析音频采集录音(3)start.setOnClickListener(newView.OnClickListener()publicvoidonClick(Viewv)if(Environment.getExternalStorageState().equals(Environme
43、nt.MEDIA_MOUNTED)trymyFile=File.createTempFile(huxz,.amr,Environment.getExternalStorageDirectory();rec = new MediaRecorder();rec.setAudioSource(MediaRecorder.AudioSource.MIC);rec.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);rec.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);rec.setOutput
44、File(myFile.getAbsolutePath();rec.prepare();rec.start();catch(Exceptione);90特制分析音频采集录音(4)stop.setOnClickListener(new View.OnClickListener()public void onClick(View v) if (myFile!=null)rec.stop();rec.release();rec=null;);91特制分析文件操作p文件目录:/data/data/filespContext类中的文件操作方法uopenFileInput(Stringname)p打开文件
45、,获得InputStreamuopenFileOutput(Stringname,intmode)p打开文件,获得OutputStreamufileList()p获得文件列表,返回StringudeleteFile(Stringname)p删除指定文件,成功则返回trueugetFilesDir()p获得/data/data/files目录92特制分析文件操作(2)pMode参数pMODE_PRIVATEu默认模式,文件只能被本程序访问pMODE_APPENDu如果文件存在,则以添加的方式打开文件pMODE_WORLD_READABLEu允许所有程序读取文件pMODE_WORLD_WRITEA
46、BLEu允许所有程序改写文件p如果需要两种模式,则让两种模式值相加u例如openFileOutput(“abc.txt,MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE);93特制分析文件操作(3)p读取Resources文件和Assets文件pResources目录下的文件u存放于res/raw目录ugetResources().openRawResource(R.raw.文件名)pAssets目录下的文件u存放于assets目录ugetResources().getAssets().open(“文件名”)u或者直接用文件名访问pfile:/android_asset/文件名94特制分析谢谢!95特制分析