Activity和Application
Activity简介
一个Activity代表一个单独的窗口
一个应用程序中会有一个Activity被指定为主界面
Activity用于提供可视化用户界面的组件,可以与用户进行交互来完成某项任务
Activity在实现时,被定义为一个独立的类,并继承android.App.Activity类或其子类
Activity生命周期:
概念
Activity由Activity栈进行管理
当一个新的Activity启动时被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止
Activity栈符合“后进先出”原则,当用户完成当前Activity并单击Back按钮时,该Activity会被弹出栈,并被销毁,然后恢复之前的Activity。
模型
onCreate() 第一次创建Activity
onStart() 启动Activity
onResume() 由暂停恢复到使用
onPause() 暂停Activity
onStop() 停止Activity
onDestory() 销毁Activity
四种状态
运行状态(Active/Running)
在屏幕的前台(栈顶)
暂停状态(Paused)
失去焦点,但依然可见(非全屏的Activity或透明的Activity被放置在栈顶)
停止状态(Stopped)
一个Activity被另外的Activity完全覆盖,不再可见
销毁状态(Killed)
通过结束Activity或杀掉进程的方式,将处于暂停或停止状态的Activity从内存中删除
三个关键循环
整个生命周期
从onCreate()开始到onDestroy()结束
可见生命周期
从onStart()开始到onStop()结束
在屏幕中可见,但不能在前台可见
前台生命周期
从onResume()开始到onPause()结束
在所有Activity的最前面,可以与用户交互
Activity类中的常用方法
方法描述setContentView(int layoutResID)设置Activity界面布局onCreate(Bundle savedInstanceState)Activity生命周期的方法,用于第一次创建ActivityonStart()Activity生命周期的方法,用于启动ActivityonPause()Activity生命周期的方法,用于暂停ActivityonStop()Activity生命周期的方法,用于停止ActivityonDestory()Activity生命周期的方法,用于销毁ActivityonResume()Activity生命周期的方法,将Activity由暂停状态恢复使用onRestart()Activity生命周期的方法,将Activity由停止状态恢复使用onKeyDown(int keyCode.KeyEvent event)键盘按键下时的动作事件处理方法onKeyUp(int keyCode.KeyEvent event)键盘按键抬起时的动作事件处理方法onTouchEvent(MotionEvent event)监听屏幕的触摸事件处理方法openContextMenu(View view)开启上下文菜单setResult(int resultCode)返回数据给上一个ActivitystartActivity(Intent intent) startActivityForResult(Intent intent,int requestCode)携带数据并跳转Activityfinish()结束当前Activity
AppcompaActivity相对于Activity的两点变化
AppcompaActivity带有toolbar的标题栏,Activity主界面没有
theme主题只能用android:theme="@style/AppTheme"(AppTheme主题或其子类)
Log日志信息
方法描述Log.e()记录错误信息Log.w()记录警告信息Log.i()记录一般提示信息Log.d()记录调试信息Log.v()记录详细信息
资源管理
概念
资源是指在代码中使用的外部文件,包括图片、音频、动画和字符串等
在程序中如果直接使用这些资源,会给阅读和维护源码带来不便
Android对资源的定义进行改变,将应用中所用到的各种资源中在res目录中定义,并为每个资源自动生成一个编号,在应用程序中可以直接通过编号来访问这些资源
在Android应用程序中,除res目录外,assets目录也用于存放资源
res目录和assets目录的区别
assets目录存放应用程序无法直接访问的原生资源,需要通过AssetsManager类以二进制流的形式来读取资源
res目录中的资源会由Android SDK在编译时,在R.java文件中为这些资源创建索引,程序可以通过资源清单类R.java对资源进行访问
资源分类
Android常用的资源
string、colors、arrays、anim(动画)、layout、drawable(图像和图标)、media(音频)
分类
原生资源:无法通过由R类进行索引的原生资源(assets下)
索引资源:可以通过R类进行自动索引的资源(res下)
通常指res目录下的资源
Android资源目录
目录描述/res/animator/存放定义属性动画的XML文件/res/anim/存放定义了补间动画或逐帧动画的XML文件/res/color/存放定义了不同状态下颜色列表的XML文件/res/drawable/存放能转换为绘制资源的位图文件或定义了绘制资源的XML文件/res/mipmap/存放能转换为绘制应用启动图标资源的位图文件/res/layout/存放各种界面布局文件,每个Activity对应一个XML文件/res/menu/存放为应用程序定义的各种菜单资源/res/raw/存放直接复制到设备中的任意文件/res/values/存放定义多种类型资源的XML文件/res/xml/存放任意的原生XMIL文件/assets/存放原生资源,包括音频文件、视频文件等
res/drawable文件夹
文件夹名dpi范围建议尺寸drawable-ldpi0-120无drawable-mdpi120-16048*48drawable-hdpi160-24072*72drawable-nodpi无关原尺寸drawable-xhdpi240-32096*96drawable-xxhdpi320-480144*144drawable-xxxhdpi480-640192*192
适配规则
Android首先会选择drawable-mdpi文件夹下的图片,文件夹下有这张图就会优先被使用,图片不会被缩放;
但是如果没有在drawable-mdpi的文件夹下找到相应图片,Android系统会首先从更高一级的drawable-hdpi文件夹中查找,如果找到图片资源就进行缩放处理,显示在屏幕上;
如果drawable-hdpi文件夹下也没有,就依次往drawable-xhdpi文件夹、 drawable-xxhdpi文件夹、drawable-xxxhdpi文件夹、drawable-nodpi查找;
如果更高密度的文件夹里都没有找到,就往更低密度的文件夹下查找;
如果都没找到,最终会在默认的drawable文件夹中寻找,如果默认的drawable文件夹中也没有,则会报错。
res/mipmap目录
mipmap:为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为mipmap。
适配不同的设备
drawable与mipmap的区别
在App中,无论你将图片放在drawable还是mipmap目录,系统只会加载对应密度中的图片。
在Launcher中,如果使用mipmap,那么Launcher会自动加载更加合适的密度的资源。
应用内使用到的图片资源,并不会因为你放在mipmap或者drawable目录而产生差异。
单纯只是资源路径的差异R.drawable.xxx或者R.mipmap.xxx。(也可能在低版本系统中有差异)
自动跨设备密度展示的能力是launcher的,而不是mipmap的。
_XML资源文件
分类
strings.xml:用于定义文本内容的资源文件
colors.xml:用于定义颜色设置的资源文件
dimens.xml:用于定义尺寸的资源文件
styles.xml:用于定义主题和样式的资源文件
文本资源文件
strings.xml文本资源文件
res\values\strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title">Resources</string>
<string name="message">Hello World!</string>
<string name="error">Wrong resource!</string>
</resources>
Java代码中访问字符串
CharSequence AppName = getString(R.string.title);
CharSequence display = getString(R.string.message);
XML文件中访问字符串资源
android:App_name="@string/title"
android:display="@string/message"
颜色资源文件
颜色值的声明方式
#RGB
#ARGB
#PRGGBB
#AARRGGBB
语法
<color name=color_name>#color_value</color>
示例
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="text_color">#F00</color>
<color name="translucent_blue">#800000ff</color>
</resources>
Java中访问颜色
int color1 = ContextCompat.getColor(context,R.color.blue);
int color2 = ContextCompat.getColor(context,R.color.translucent_blue)
在API 23以前的低版本中,使用getResources().getColor(colorRes)方法访问颜色资源,新版本已经用ContextCompat.getColor(context,colorRes)代替。
dimens.xml尺寸定义资源文件
测量单位描述资源标记示例像素实际的屏幕像素px10px英寸物理测量单位in6in毫米物理测量单位mm4mm点普通字体测量单位pt12pt密度独立像素相对于160pi屏幕的像素dp3dp比例独立像素对于字体显示的测量sp10sp
dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resource>
<dimen name="one_pixel">1px</dimen>
<dimen name="two_inches">2in</dimen>
<dimen name="doublke_density">2dp</dimen>
<dimen name="fourteen_sp">14sp</dimen>
</resource>
Java中访问
float dimen = getResources.getDimension(R.dimen.one_pixel);
float dimen = getResources.getDimension(R.dimen.fourteen_sp);
XML中访问
android:textSize = "@dimen/fourteen_sp"
android:textSize = "@dimen/double_density"
sytles.xml主题风格资源文件
<sytle name = style_name>
<item name = item_name>Hex value|string value|reference</item>
</sytle>
Java中访问样式资源
setTheme(R.style.ThemeNew);
setTheme(R.style.myStyle);
XML中访问样式资源
android:App_name="@style/ThemeNew"
android:display="@style/myStryle"
AndroidManifest.xml清单文件
Android应用程序的全局描述配置文件
每一个Android应用程序必须有且放在根目录下
包含信息
声明应用程序的包名
描述应用程序组件
确定宿主应用组件进程
声明应用程序拥有的权限
定义应用程序所支持API的最低等级
列举应用程序必须链接的库
设置清单文件的属性时需要遵守几项规则:
元素:在所有的元素中只有
和
是必需的且只能出现一次
属性:元素的属性大部分是可选的但有少数属性是必须设置的
定义类名:所有的元素名都对应其在SDK中的类名
多数值项:如果某个元素有超过一个数值时,必须通过重复的方式来说明该元素的某个属性具有多个数值项,且不能将多个数值项一次性说明在一个属性中
资源项说明:需要引用某个资源时,采用“@[package:]type:name”格式进行引用
字符串值:类似于其他语言
自定义权限使用
元素声明
<permission
android:label="自定义权限"
android:description="@string/test"
android:name="com.example.project.TEST"
android:protectionLevel="normal"
android:icon="@drawable/ic_launcher">
</permission>
Android的不同权限级别的区分如下:
normal:低风险
dangerous:高风险
signature:签名权限
signatureOrSystem:签名或系统权限
Android应用程序生命周期
Android应用程序的生命周期是指在Android系统中进程从启动到终止的所有阶段,即Android程序启动到停止的全过程
程序的生命周期由Android系统进行调度和控制
在系统内存不足的情况下,Android系统会选择性的终止一些重要性比较低的应用程序,以便回收内存供更重要的应用程序使用
Android根据应用程序的组件及组件当前运行状态将所有的进程按重要性程度从高到低划分为5个优先级
前台进程:显示在屏幕前端并与用户交互
可见进程:部分程序界面可见,却不能与用户交互
服务进程:由startService()方法启动服务的进程
后台进程:不包含任何已经启动的服务,且没有任何可见的Activity的进程
空进程:不包含任何活跃组件的进程
Application类、样式和主题
Application类
android.App.Application类代表当前运行的应用程序。
应用程序启动时,系统会自动创建对应Application类的实例,并一直伴随应用程序的生命周期,且始终维持一个实例。
Application适合保存应用程序多个组件都需要访问的对象。
通过扩展Application类,可以完成3项工作:
对Android运行时广播的应用程序级事件(如低内存)做出响应
在应用程序组件之间传递对象
管理和维护多个应用程序组件所使用的资源
Application生命周期事件
Application类为应用程序的创建和终止、低可用内存和配置的改变提供了事件处理程序∶
在重写这些方法时必须调用父类的事件处理程序
onCreate()
onLowMemory()
onTrimMemory()
onConfigurationChanged()
实现Application
步骤
创建一个类继承Application
在Activity中使用Application类
运行
样式和主题
样式:一个包含一种或者多种格式的集合,一般作为一个单位用于XML布局的某个元素中。
主题:一个包含一种或者多种格式的集合,通常作为一个单位应用到Activity中。
程序中的样式
步骤:
在res/values目录下新建一个名为style.xml的文件,并增加
元素作为根元素
为
元素增加一个全局唯一的name属性
在
元素内部声明一个或者多个
元素,每一个
元素用于定义了一个name属性,并在元素的内部进行赋值
引用在其它XML中已经定义的资源
样式的声明
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="SpecialText" parent="@style/Text">
<itme name="android:textSize">18sp</itme>
<itme name="android:textColor">#008</itme>
</style>
</resources>
样式的引用
<EditText id="@+id/text1"
style="@style/SpecialText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello,World!" />
程序中的主题
主题的声明
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme">
<item name="android:windowNoTitle">true</item>
<item name="windowFrame">@drawable/screen_frame</item>
<item name="windowBackground">@drawable/screen_background_white</itme>
<item name="panelForegroundColor">#FF000000</itme>
<item name="panelBackgroundColor">#FFFFFFFF</item>
<item name="panelTextColor">?paneForgroundColor</item>
<item name="panelTextSize">14</item>
<item name="menuItemTextColor">?panelTextColor</item>
<item name="menuItemTextSize">?panelTextSize</item>
</style>
</resources>
设定所有Activity都使用同一主题
<Application android:theme="@style/CustomTheme">
设定某个Activity使用某一主题
<activity android:theme="@style/CustomTheme">
设置Activity为内置的对话框主题
<activity android:theme="@android:style/Theme.Dialog">
继承Theme.Dialog主题生成一个新主题
<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
在Activity程序中设置主题
protected void onCreate(Bundle savedinstanceState){
super.onCreate(savedInstanceState);
......
setTheme(android.R.style.Theme_Light);
setContentView(R.layout.linear_layout_3);
}
在Activity中加载主题时,主题中不能包括任何系统启动该Activity所使用的动画,这些动画将在程序启动前显示。
在清单文件中配置Activity对话框格式主题
<activity android:name".ThemeDemo01Activity"
android:theme="@android:style/Theme.Dialog">
</activity>
java中设置Activity对话框格式主题
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTheme(android.R.style.Theme_Dialog);
setContentView(R.layout.activity_theme_demo02);
}