03-Android程序设计-Activity_第1页
03-Android程序设计-Activity_第2页
03-Android程序设计-Activity_第3页
03-Android程序设计-Activity_第4页
03-Android程序设计-Activity_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android: Activity,武汉科技大学计算机学院 2020年7月,嵌入式系统开发与设计,Activity简介,Android核心组件:Activity,Activity 活动 Andorid组件中最基本也是最为常见用的组件 在Android应用中,一个Activiy通常就是一个单独的屏幕 每个Activity都被实现为一个从活动积累继承来的独立的类 活动类显示的用户接口由视图控件组成,并对事件做出响应 Activity是Android应用程序的表示层 使用View来构成显示信息和响应用户动作的UI 可以看做是开发环境中的Form 应用程序越复杂,需要的屏幕可能越多,3,Activit

2、y的创建与使用,Activity的创建和使用,创建Activity 在Activity类的基础上进行扩展 在Activity中定义UI并实现其功能 基本Activity类提供了封装了窗口显示处理功能的空白屏幕 交互和显示还需要进行设计 Activity的注册 应用程序中的Activity需要在AndroidManifest.xml中进行注册 没有对应标签的Activity不能被启动,5,Activity的创建和使用(2),在android.app.Activity类中,Android定义了一系列方法 在应用程序中通过对这些方法的复写来完成对Activity的创建和使用 public class

3、 OurActivity extends Activity protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onReStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); ,6,Activity的创建和使用(3),protected void onCreate(Bundle savedI

4、nstanceState) 一个 Activity 的实例被启动时调用的第一个方法 一般都会覆盖该方法作为应用程序的一个入口点 完成一些初始化数据、设置用户界面等工作 大多数情况下,在该方法中从xml 中加载设计好的用户界面。 例如setContentView(R.layout.main); 也可从 savedInstanceState中读取保存到存储设备中的数据 需要判断 savedInstanceState是否为null,因为Activity第一次启动时并没有数据被存贮在设备中 if(savedInstanceState!=null) savedInstanceState.get(Key)

5、; ,7,Activity的创建和使用(4),protected void onStart() 在 onCreate() 方法之后被调用,或者在 Activity 从 Stop 状态转换为 Active 状态时被调用 Protected void onReStart() 在Activity被停止后调用 protected void onResume() 在 Activity从 Pause 状态转换到 Active 状态时被调用,8,Activity的创建和使用(5),protected void onPause() 在 Activity 从 Active 状态转换到 Pause状态时被调用 必

6、要时也需要保存状态和数据 protected void onStop() 在 Activity 从 Active 状态转换到 Stop 状态时被调用 一般在这里保存 Activity 的状态信息 protected void onDestroy() 在 Activity 被结束时调用,它是被结束时调用的最后一个方法 一般完成释放资源,清理内存等工作,9,Hello World!,Java文件-应用程序源文件 android 本身相当一部分都是用java 编写而成 android 的应用使用java 来开发 Class文件-Java编译后的目标文件 Google使用Dalvik 来运行应用程序

7、Android的class 文件是编译过程中的中间目标文件,需要链接成dex 文件才能在Dalvik 上运行,10,Hello World!(2),Dex文件-Android平台上的可执行文件 Android 虚拟机Dalvik 支持的字节码文件格式 Apk文件-Android上的安装文件 Apk 是Android 安装包的扩展名,一个Android 安装包包含了与该Android 应用程序相关的所有文件 apk文件将AndroidManifest.xml文件、应用程序代码(.dex 文件)、资源文件和其他文件打成一个压缩包 一个工程只能打进一个.apk文件 apk 文件的本质是一个zip包,

8、11,Hello World!(3),Eclipse自动生成 new android project HelloAndroid,12,Hello World!(4),代码:HelloWorld.java,13,package 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 sa

9、vedInstanceState) super.onCreate(savedInstanceState); setContentView(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; ,Hello

10、World!(5),一个Activity就是一个类 这个类要继承于Activity 重写onCreate方法 public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout. activity_hello_world); ,14,Hello World!(6),R.java,15,/* AUTO-GENERATED FILE. DO NOT MODIFY. */ package com.myapps.helloworld; public fin

11、al class R public static final class attr public static final class dimen public static final int activity_horizontal_margin=0 x7f040000; public static final int activity_vertical_margin=0 x7f040001; public static final class drawable public static final int ic_launcher=0 x7f020000; public static fi

12、nal class id public static final int action_settings=0 x7f080000; public static final class layout public static final int activity_hello_world=0 x7f030000; public static final class menu public static final int hello_world=0 x7f070000; public static final class string public static final int action

13、_settings=0 x7f050001; public static final int app_name=0 x7f050000; public static final int hello_world=0 x7f050002; public static final class style public static final int AppTheme=0 x7f060001; ,Hello World!(7),activity_hello_world.xml,16, ,Resources,Hello World!(8),每一个Activity都需要在AndroidMainfest.

14、xml中 文件当中进行配置 为Activity添加必要的控件 通过findViewById(控件的id);可以得到所要显示的控件 例如取得TextView的控件 TextView textView=(TextView)findViewById(R.id.Test);,17,Hello World!(9),布局文件中的属性很多 通过布局文件来定义重要的属性 android:layout_width 宽度 android:layout_height 高度 match_parent | wrap_content android:layout_weight:权重 (默认为0) android:id 唯

15、一标识,用于在程序或配置文件中引用,18,Hello World!(10),strings.xml,19, HelloWorld Settings Hello world! ,将要显示内容: HelloWorld.,Hello World!(11),RUN,20,RUN,Hello World!(12),21,Hello World!(13),22,Hello World!(14),Activity是Android应用程序的用户接口 一个Activity中可以放置很多控件 Activity也可以理解为控件的容器,23,按钮,列表,文本,Hello World!(15),模拟器屏幕 最大支持12

16、80*800 10.1” Tablet,WXGA 7.3” Nexus 7 最小支持240*320 2.7” QVGA,24,Hello World!(16),命令行运行 启动模拟器 emulator -avd 2.3 scale auto,25,Hello World!(17),命令行运行 连接模拟器 telnet localhost 5554,26,Hello World!(18),命令行运行 拨打电话: gsm call27,Hello World!(19),命令行运行 发送短信: sms sendHelloWorld,28,Andro

17、id程序结构,/src Java源代码存放目录 /gen 自动生成目录 存放所有由Android开发工具自动生成的文件,29,Android程序结构(2),/gen/R.java R.java文件由Android开发工具自动产生的 Android开发工具会自动根据放入res目录的xml界面文件、图标与常量,同步更新修改R.java文件 R.java文件是由开发工具自动生成的,应避免手工修改R.java R.java在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的id 通过R.java,应用可以很方便地找到对应资源 另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用

18、到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间,30,Android程序结构(3),/res 资源(Resource)目录 存放应用使用到的各种资源,如xml界面文件,图片或数据,31,Android程序结构(4),res目录下的资源文件 除string之外,还可以定义color ,dimens string-array (子标记为 item) 每种资源都需要定义name属性 资源文件放在 res/values目录下 可以是单独的文件 可以分类放在不同文件中 文件名任意 资源目录中不能随意创建子目录 布局资源的文件名和图片资源的文件名只允许小写字母和数字,32,Android程序结

19、构(5),res/xml目录 其他资源 任意XML文件,程序中用R.xml.文件名访问 res/raw目录 原始资源 程序中用Resources对象.openRawResource(R.raw.XXX)获得一个输入流 原始资源不会被编译为二进制 asset 放入assets目录,系统不会自动生成id,程序中用Resources对象.getAssets().open(文件名)获得输入流 assets目录则可以随意创建子目录,33,Android程序结构(6),对资源的引用 程序中 利用R.资源类型.资源名 访问 例如R.layout.main R.id.abc 或者使用getResources(

20、)得到Resources对象,用于将资源的id值转为相应的对象 例如getText,getColor,getDrawable XML文件中 利用资源类型/资源名 访问 例如 id/abc +id/abc 表示添加一个id资源“abc”,34,Android程序结构(7),AndroidManifest.xml 列出了应用程序所提供的功能 可以指定应用程序使用到的服务(如电话服务、互联网服务、短信服务、GPS服务等等) 新添加一个Activity的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此Activity 包括了安全访问权限 perties 项目环境信息

21、,一般是不需要修改此文件,35,Activity的生命周期,Activity的生命周期,Android应用程序不能控制所拥有进程的生存期 Android系统在运行时管理每个应用程序的进程 同样业管理每个进程内的每个活动 Activity的管理 所有的Activity由Android系统的Activity栈管理 当前所有正在运行的进程的后进先出的集合 Activity的状态由它在栈中的位置所决定 一个新的Activity执行后被放置到栈的顶端,变 成“running activity”,此前的Activity存在于堆栈中,一般不在前景 如果通过“Back”返回此前的Activity或者当前Act

22、ivity被关闭,栈中的下一个活动变成栈顶活动,并成为活动状态,37,Activity的生命周期(2),Activity的状态 Activity在系统中不断的被创建和销毁 在Activity栈中被移进和移出 Activity在不同的状态中转换 Activity的4个状态 活动状态(Active) 暂停状态(Paused) 停止状态(Stop) 非活动状态(Finish/Kill),38,Activity的生命周期(3),Activity:活动状态 位于Activity栈的栈顶 可见的、focused的前台Activity 处于屏幕的最上层 Android系统会尽力维持活动状态Activity的

23、运行 通过适当的销毁其他的Activity来保证活动状态Activity所需的资源 当有某个Activity变为活动状态时,该活动被暂停 处于paused状态,39,Activity的生命周期(4),Activity:暂停状态 特定情况下可见但不是焦点的Activity 非全屏或者半透明状态 仍处于近似active的状态 自身的状态和数据都存在 与窗口管理程序保持联系 不能接收用户的输入事件 被系统终止 当系统内存资源不足时会被终止 状态的转变 不可见时转变为停止状态,40,Activity的生命周期(5),Activity:停止状态 当一个Activity 被其它的Activity 完全的遮

24、盖住时,Activity的状态发生变化 仍保有其状态及数据 已变为不可见,画面是隐藏且不需要更新 停止状态的Activity会被终止 当系统内存不足时,stop 状态的Activity首先被终止已释放内存 状态的转换 Activity退出或者被关闭,41,Activity的生命周期(6),Activity的终止不受程序员控制 可以通过程序创建和运行Activity,并使用方法停止Activity 终止Activity由Android系统决定 当Activity处于pause或者stop状态时可能被系统终止并回收 应用程序运行过程中的一些状态(用户输入等)需要保存到持久存储中 应用程序中启动了其

25、他后台线程,同样也需要进行处理 否则会失去运行时的状态或输入或者 由于没有处理后台线程导致异常,42,Activity的生命周期(7),Activity状态的转换 除栈顶Activity外均为pause/stop/finish/kill状态 一旦栈顶Activity失去焦点就变为pause/stop/finish/kill状态,同时新的Activity或者栈中的下一个Activity成为栈顶Activity 转换的控制 状态的转换由系统控制,对用户不可见 转换过程中所存储的数据和状态在Activity转换为active状态时就需要进行恢复,43,Activity的生命周期(8),44,完整生命

26、周期,可视生命周期,前台生命周期,Activity的生命周期(9),完整生命周期 Activity的完整生命周期自第一次调用onCreate()方法开始,到调用onDestroy()为止 如果Activity所在的进程被终止,那么即使没有调用onDestroy方法Activity也结束其存在 在onCreate()中设置所有“全局”状态以完成初始化 初始化Activity 扩展(inflate)UI 分配对类变量的引用 将数据绑定到控件 创建服务和线程 在onDestroy()中释放所有系统资源 通过重写来清除,保证所有外部资源被关闭,45,Activity的生命周期(10),Activity

27、的可视生命周期 自onStart()调用开始直到相应的onStop()调用结束 在此期间,用户可以在屏幕上看到Activity 可能不是用户关注的活动,或者不与用户进行交互 可以保留用来向用户显示这个Activity所需的资源 Activity的可视生命周期可能多次经历 onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用 在可视生命周期内可能被直接销毁,而不调用onStop方法,46,Activity的生命周期(11),onStop方法 用来暂停或者停止动画、线程、计时器、服务或者其他专门用于更新UI的进程 UI不可见时该方法只消耗资源而没有意义 onSt

28、art/onReStart 当UI可见时使用这两个方法恢复或者重启进程 onReStart可以实现当Activity在其完整生命周期内重启才能完成的处理 onStart/onStop 也可以用来注册和销毁专门用来更新UI的广播接收器,47,Activity的生命周期(12),Activity的前台生命周期 自onResume()调用起,至相应的onPause()调用为止 在此期间,Activity位于前台最上面并与用户进行交互,接受用户的输入 Activity会经常在暂停和恢复之间进行状态转换 当Activity不被关注或者有新的Activity启动时,将调用onPause()方法 当Acti

29、vity获得结果或者接收到新的Intent时会调用onResume()方法 onReusme()方法中的代码尽可能的少,以保证切换时的响应速度 onPause() 一般重写来托管未保存的改动 处于pause状态的Activity可能被销毁,48,多Activity的使用,Log,android.util.Log类的静态方法 查找错误和打印系统日志消息。 Log常用的方法有以下5个: Log.v(String tag, String msg);(VERBOSE) Log.d(String tag, String msg); (DEBUG) Log.i(String tag, String msg

30、); (INFO) Log.w(String tag, String msg); (WARN) Log.e(String tag, String msg)。 (ERROR),50,Log(2),根据规范建议 Log.v、Log.d 信息应当只存在于开发过程中 最终版本只可以包含三种日志信息 Log.i Log.w Log.e 实际利用DDMS进行调试 三种日志区别不大 显示的颜色不同,51,Log(3),V Verbose D Debug I Info W Warn E Error F Fatal S Silent,52,Log(4),Log.v(黑色) 任何消息都会输出,一般用这个进行程序运

31、行状态的输出 Log.i(绿色) 输出提示信息 Log.d(蓝色) 输出Debug信息 Log.w(黄色) 输出警告信息 Log.e(红色) 输出错误信息,53,Log(5),54,DDMS,DDMS Dalvik Debug Monitor Service IDE、emulator与实际android设备之间通信的桥梁 DDMS的作用 捕捉到终端的ID,并通过adb建立调试器,从而实现发送指令到测试终端的目的 为测试设备截屏 针对特定的进程查看正在运行的线程以及堆信息 Logcat 广播状态信息 模拟电话呼叫 接收SMS 虚拟地理坐标等等,55,DDMS(2),开启DDMS,56,DDMS(

32、3),57,音频播放实例,播放音频资源 android.media.MediaPlayer p = MediaPlayer.create(Context,R.raw.XXX); p.prepare(); p.start() ;/播放 播放外部音频文件 MediaPlayer p = new MediaPlayer(); p.setDataSource(url) /url可以是 /sdcard/XXX 也可以是网络中的URL p.prepare(); p.start();,58,音频播放实例(2),59,android应用开发解密书中第7章代码,音频播放实例(3),程序编译通过,运行错误,60,

33、音频播放实例(4),LogCat信息,61,音频播放实例(5),62,音频播放实例(6),63,音频播放实例(7),64,音频播放实例(8),65,音频播放实例(9),将文件发送到设备上,66,音频播放实例(10),67,SD Card,在模拟器中使用SDCard 需要先创建一张SDCard卡 创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用命令行方式进行创建: 在命令行窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀建议使用.img mksdcard 2048M D:sdcard.img,68,SD Card

34、 (2),程序中访问SDCard 需要申请访问SDCard的权限 在AndroidManifest.xml的Manifest标签中加入访问SDCard的权限如下 ,69,SD Card (3),向SDCard存放文件 程序必须先判断手机是否装有SDCard,并且可以进行读写 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) File sdCardDir = Environment.getExternalStorageDirectory(); File saveFile = new File(sd

35、CardDir, “abc.txt”); android.os.Environment.getExternalStorageState()方法 用于获取SDCard的状态 如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于MEDIA_MOUNTED Environment.getExternalStorageDirectory()方法 用于获取SDCard的目录或者 写成File saveFile = new File(/sdcard/abc.txt);,70,SD Card (4),71,SD Card (5),72,SD Card (6),73,SD Card (7),74

36、,SD Card (8),75,SD Card (9),76,MediaPlayer的生命周期,创建 -setDatasourse -prepare -start -pause -start -stop -release 调用stop进入停止状态,再播放要先调用prepare再调用start,77,MediaPlayer的生命周期(2),78,MediaPlayer的生命周期(3),try MediaPlayer player= new MediaPlayer(); player.setDataSource(/sdcard/nx.mp3); player.prepare(); player.s

37、tart(); Thread.sleep(15000); player.stop(); Thread.sleep(5000); player.prepare(); player.start(); Thread.sleep(20000); player.stop(); player.release(); catch (Exception e) e.printStackTrace();,79,模拟器来电铃声设定,80,模拟器来电铃声设定(2),81,模拟器来电铃声设定(3),铃声选择为空,所以来电都没有铃声,82,将sdcard上某音乐加入铃声,public class MainActivity

38、extends Activity private static final String TAG=LogDemo; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getmusicfromsdcard();/EmLession+ ,83,将sdcard上某音乐加入铃声(2),private void getmusicfromsdcard() String filename=/sd

39、card/ydgqq5.mp3; File k = new File(filename); / path is a file to /sdcard ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath(); values.put(MediaStore.MediaColumns.TITLE, “ydggq5”); values.put(MediaStore.Audio.Media.IS_RINGTONE, true); values.put(Me

40、diaStore.Audio.Media.IS_NOTIFICATION, false); values.put(MediaStore.Audio.Media.IS_ALARM, false); values.put(MediaStore.Audio.Media.IS_MUSIC, false);,84,将sdcard上某音乐加入铃声(3),/Insert it into the database Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath(); Uri newUri = getContentR

41、esolver().insert(uri, values); try RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, newUri); catch (Throwable t) Log.d(TAG, “catch exception”); ,85,设置某音乐为当前铃声,86,设置某音乐为当前铃声(2),87,音频采集录音,创建MediaRecorder对象rec (来自android.media包) 开始录音 创建File对象,扩展名为amr, rec.setOutputFile(f

42、.getAbsoulutePath() rec.setAudioSource(MediaRecorder.AudioSource.MIC)/设置声源 rec.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT)/输出格式 rec.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT)/音频格式 rec.prepare() rec.start() 结束录音 rec.stop() rec.release() rec=null 权限 android.permission.RECORD_AUDIO,88,音频采集录音

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论