首页 > 代码库 > Android核心基础第五天

Android核心基础第五天

一、学习目标及要求

课程目标

课程内容(必须讲的内容,就是讲课的知识点的顺序)

* 掌握Activity 配置

* 掌握 Intent 显示意图

* 掌握 Intent 隐式意图

* 掌握两种意图的使用场景

* 掌握 activity 开启的数据传递

* 掌握activity的生命周期

* 掌握横竖屏切换的生命周期

* 掌握不同android版本 生命周期的细微差别

* 掌握开启activity获取返回值

* 掌握请求码 结果码的作用

* 掌握程序入口activity配置参数

* 掌握显示意图    显示意图开启新的activity

* 掌握隐式意图    隐式意图开启新的activity    隐式意图的intent filter

* 掌握两种意图的使用场景

* 掌握activity开启的数据传递

传递基本类型数据

传递对象数据

* 掌握activity的生命周期

* 掌握横竖屏切换的生命周期    生命周期的控制

* 掌握不同android版本    生命周期的细微差别

* 掌握开启activity获取返回值

案例: 选择联系人 短信群发器

* 掌握请求码 结果码的作用

区分请求的类型 区分返回的类型

二、学习要点

1.☆Activity参数配置

1.1 应用程序的入口activity需要配置两个参数

<!-- 程序的入口activity需要配置两个参数 -->
<intent-filter>
    <!-- 当前activity是应用程序的入口 -->
    <action android:name="android.intent.action.MAIN" />
    <!-- 当前activity会在桌面应用创建一个快捷方式 -->
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

1.2 一个应用程序可以创建多个入口的activity,快捷图标

<!-- 只要配置了,就会在桌面上创建一个新的快捷图标 -->
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

1.3 Activity 清单文件中的配置

属性 作用 说明 举例
action activity对应的动作 可以用任意一个字符串描述(最好,顾名思义) <action android:name="android.intent.action.MAIN" />
category 额外的类别参数 指定工作的设备(车载电脑,机顶盒,默认的手机) <category android:name="android.intent.category.CAR_DOCK">
data

指定数据和数据的类型

scheme 数据前缀
host 主机名
port 端口号
path 路径 前面加上 /
mimeType 数据类型
<data android:scheme="calc"  />

1.4 Activity的重要作用

>应用程序之间的解耦。
        不用应用程序的界面可以互相调用。
      >应用程序开放的,不是封闭的。

2. ☆☆Intent 意图

2.1 Intent 显式意图

显式意图. 直接指定要激活的activity。效率高 直接指定。

//显式意图
//第一种写法
intent.setClassName(this, "com.itheima.rpcalc.SecondActivity");
startActivity(intent);
//第二种写法
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);

2.2 Intent 隐式意图

动作,数据,category)开启新的activity。
主要应用场景:激活别的应用程序的activity。查询系统里面满足条件的activity,再把activity激活,效率较低,比较慢。

//隐式意图
intent.setAction("com.itheima.rpcalc.view");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("calc://张三"));
startActivity(intent);

2.3 两种意图的使用场景

如果激活的是应用程序内部的activity,推荐使用显示意图,直接指定包名类名。效率高。
      如果激活的是其他应用程序的activity,推荐使用隐式意图,通过action和data指定。

3. ☆intent传递数据

3.1 大基本类型数据 以及数据的数组都是可以通过intnet传递


intent.putExtra(name,values)

3.2 intent传递对象

要求对象一定是实现Serializable接口的 可序列化的对象。 
      要求对象一定是实现Parcelable 接口

Javase序列化是把对象序列化文件里面。
      Parcelable序列化到内存里面。

3.3 传递一组数据

Bundle extras = new Bundle(); 
      intent.putExtras(extras);

4.  ☆开启新的activity获取返回值

4.1 调用者activity开启新的界面的时候

startActivityForResult(intent, 0);

4.2 在新的开启的activity里面如果想设置返回值。

设置结果数据
       setResult(0, data);


4.3 新开启的activity如果操作完毕,关闭

finish();

4.4 数据会返回给调用者(开启者)activity

onActivityResult(int requestCode, int resultCode, Intent data) {}
data 参数就是返回的结果数据 从里面把数据取出来
requestCode 请求码 区分请求来自于哪个按钮
resultCode 结果码 区分请求来自于哪个结果

5. ☆☆Activity生命周期

5.1 什么是生命周期

人的生命周期  幼儿园-->小学-->中学--->大学-->找工作-->结婚-->生小孩-->退休-->翘辫子

java代码. 对象的生命周期
      activity生命周期 对象从new出来到被dailvik虚拟机回收的过程中执行的方法。

5.2 生命周期的重要方法

         image

oncreate   -->activity被创建的时候调用。 适合做界面的初始化操作。 
      onDestroy -->activity被销毁的时候调用。 适合做扫尾的操作。数据保存的操作。 短信内容的保存

onstart --->activity界面用户可见。 适合更新界面。 继续播放视频 
      onstop --->activity界面用户不可见。 界面不可见适合清理操作。暂停视频。 视频播放器

onresume -->获取焦点 按钮可以被点击
      onpause   -->失去焦点 按钮可以看到,但是不可以被点击。 游戏使用

5.3 常见的生命周期

完整生命周期 oncreate-->onstart-->onresume-->onpause-->onstop-->ondestory

可视生命周期 onstart-->onresume-->onpause—>onstop 

如果界面不可见 onstop方法,下一次界面重新可见,先调用onRestart(),再调用onstart();

前台生命周期 onresume-->onpause

5.4 横竖屏切换的生命周期

默认情况下 横竖屏切换 activity销毁 --> 重新创建
把屏幕朝向写死 
      android:screenOrientation="landscape" 横屏
      android:screenOrientation="portrait"     竖屏
设置横竖屏切换不敏感   
      android:configChanges="orientation|keyboardHidden|screenSize"

6 进程、线程、应用程序、任务栈、启动模式

6.1 进程

android中进程
android系统 ,应用程序退出和进程退出是两个不同的概念。
android系统为了让应用程序可以被快速的开启。所有的应用程序退出后,进程是不会退出的。
只有系统的内存空间严重不足的时候,才会把进程给回收。
点击图标-->linux创建进程-->dalvik虚拟机-->读取清单文件,加载activity
android理解应用程序退出: 任务栈清空。

6.2 线程

进程是操作系统分配内存空间的单位,每个进程的内存空间都是独立的。
线程是运行在进程里面。线程cpu执行的最小单位。如果进程挂了,线程也挂了。

6.3 应用程序 application

android应用程序每个应用程序都是运行在自己的sandbox(沙箱)。
理解成一组activity,service,content priovder broadcastreceiver的组合。

6.4 任务栈的细节

每个应用程序运行,系统都会分配一个新的任务栈。
问题:问系统里面有多少个任务栈存在?
有多少个应用程序正在运行(activity没有都被销毁,回桌面),就有几个任务栈。
任务栈的id是一个int类型的整数,自增长的id。

6.5 启动模式

有四种启动模式

standard 标准的启动模式。一个activity默认就是标准的启动模式。开启新的activity,activity就会被创建出来,加入到任务栈的栈顶。适用于绝大多数的应用场景。

singleTop 单一顶部启动模式。如果发现,这个activity已经被启动了,并且在任务栈的栈顶,activity就不会别重新创建。
解决一个用户体验的问题。避免已经打开的界面重复的被打开多次。
        for(int i = 0;i<100;i++){
            弹出收藏夹
        }
浏览器添加到书签,singletop
在同一个任务栈里面可以有多个实例存在。

singleTask 单一任务栈启动模式。 开启新的activity的时候,会去检查任务栈里面是否有这个activity的实例存在,如果有实例存在,就直接清空这个实例上面的所有的activity,复用这个已经存在的activity实例。
在同一个任务栈里面只有一个实例存在。
在什么时候使用singletask模式?
BrowserActivity 浏览器 开销(内存占用,cpu占用)非常大,singletask。保证在一个任务栈里面只有一个实例存在。
webkit 内核 页面。
  html解析器
  html渲染器
  css 渲染器
  javascript 执行引擎
如果一个activity的资源开销非常大,建议使用singletask的启动模式。
浏览器的activity使用的就是singletask的启动模式。

singleinstance 单一实例。类似于java中的单例模式,单态模式。在整个android手机操作系统里面只有一个activity的实例存在。
singleinstance启动模式的activity会运行在自己单独的任务栈里面。
>如果你希望一个activity,在整个手机操作系统里面只有一个实例存在。配置singleinstance
>InCallScreen 通话的activity配置模式是singleinstance的。在整个手机操作系统里面只有他一个实例存在。

6. 重要示例

 

6.1 人品计算器

6.2 短信发送器