01_AndroidManifest文件中的几个细节
每个activity就是一个界面。
结论:
1、一个应用程序可以创建多个桌面图标:
创建桌面图标的方法:
<intent-filter>
//应用程序的入口
<action android:name="android.intent.action.MAIN" />
//启动器
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
2、activity节点中的label标签的值是界面的标题;
3、application节点中的label标签的是应用程序的名称,可以应用程序管理列表中看到;
4、application节点中的label标签和activity节点中的label标签不是一个概念;
02_意图设置动作激活新的界面(重点)
从A界面跳转到B界面;
aciton:动作 可以自定义,也可以使用系统定义好的;
category:类型,lancher启动器,car_dock\car_mode车载电脑模式,default默认,
我们开发的activity通常都是default类型。
Intent:意图。做一件事情的想法就是意图。
intent的作用:激活组件,携带参数。
意图:动作、数据;
开启activity的步骤:
//创建一个intent
Intent intent = new Intent();
//设置动作
intent.setAction("android.intent.action.SHOWSECOND");
//设置数据
intent.setData(Uri.parse("itheima://110"));
//设置类型
intent.addCategory("android.intent.category.DEFAULT");
//开启activity 界面
//根据intent设置的属性在清单文件中与activity的intent-filter中设置的数据去匹配
startActivity(intent);
03_意图设计的目的
架构师、构架师:多快好省的完成一个项目.
代码重复利用。
高内聚、低耦合:模块之间可以独立运行、又可以相互调用;
04_隐式意图和显式意图(重点)
- 隐式意图:开启activity时候没有直接指定目标Activity的名称,通过指定一组动作、数据、类型让系统自动去配置文件中匹配目标activity。
-
应用场景:开启别应用程序的activty。 缺点: 开启activity时需要匹配配置文件中的activity,耗费时间。
-
显式意图:开启activity时候直接指定目标Activity的名称.比较快。
-
应用场景:限于应用程序内部调用activity。
-
隐式意图:
//创建一个intent Intent intent = new Intent(); //设置动作 intent.setAction("android.intent.action.SHOWSECOND"); //设置数据 intent.setData(Uri.parse("itheima://110")); //设置类型 intent.addCategory("android.intent.category.DEFAULT"); //开启activity 界面 //根据intent设置的属性在清单文件中与activity的intent-filter中设置的数据去匹配 startActivity(intent);
-
创建显示意图
-
Intent intent = new Intent(this, SecondActivity.class); startActivity(intent);
05_意图传递数据(重点)
使用intent传递数据,调用putExtra、putExtras方法;
-
可以传递的数据类型:
8大基本数据类型、数组; Bundle 类似于map的数据结构 pacelable 序列化到内存中; serializable 序列化到文件中;
-
传递参数代码:
//创建显示意图 Intent intent = new Intent(this, SecondActivity.class); //传递参数 //intent.putExtra("ask", "学挖掘机哪家强"); Bundle b = new Bundle(); b.putString("answer", "中国山东找蓝翔"); intent.putExtra("params", b);
-
接收参数代码:
Intent intent = getIntent(); //String ask = intent.getStringExtra("ask"); Bundle b = intent.getBundleExtra("params"); String answer = b.getString("answer");
06_URI详解
<data android:scheme="http" android:host="www.baidu.com" android:port="80" android:path="/image/1.jpg" />
http://www.baidu.com/image/1.jpg
07_开启activity获取返回值(重点)
从A界面跳转到B界面,当B界面关闭的时候,返回一些数据给A界面。
步骤:
1、在A界面上开启B界面,调用的方法是startActivityForResult;
//开启一个activity并期待返回数据
startActivityForResult(intent, 0);
2、关闭B界面,关闭之前设置返回的数据;
//设置返回数据
Intent data = new Intent();
data.putExtra("answer", "中国山东找蓝翔");
setResult(100, data);
//关闭当前界面
finish();
3、在A界面开启一个方法接收B界面返回的数据;
/**
* 接收目标activity返回的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String answer = data.getStringExtra("answer");
Toast.makeText(this, answer, 0).show();
}
08_请求码和结果码的作用(重点)
作用:用来判断是哪个业务逻辑界面返回的数据;
代码:
/**
* 接收目标activity返回的数据
* requestCode 请求码,在开启activity设置的
* resultCode 结果码,设置返回数据时设置的
*
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String result = data.getStringExtra("result");
if(requestCode == 0){
Toast.makeText(this, "第二个界面返回的数据:"+result, 0).show();
}
if(requestCode == 1){
Toast.makeText(this, "第三个界面返回的数据:"+result, 0).show();
}
}
09_activity的生命周期(重点)
-
打开一个界面:
onCreate 初始化activity onStart 开始activity onResume 暂停之后继续工作(缓冲)
-
关闭一个界面:
-
onPause 暂停每个任务 onStop 停止activity工作 onDestroy 销毁activity实例
-
最小化一个界面:
onPause 暂停每个任务 onStop 停止activity工作
-
最小化一个界面后重新打开:
onRestart 重新打开一个activity onStart 开始activity onResume 暂停之后继续工作(缓冲)
10_读文档查看activity的生命周期
11_横竖屏切换的生命周期(重点)
横竖屏切换时:先销毁前一个activity的实例对象,重新创建一个新的activity实例;
landscape横屏、portrait竖屏、sensor传感器类型;
禁用横竖屏: android:configChanges="orientation|keyboardHidden|screenSize";
12_任务栈的概念
队列:先进先出;
栈:先进后出;
任务:一个activity的实例(Task);
每打开一个界面代表有一个任务入栈;
每关闭一个界面代表有一个任务出栈;
当任务栈清空的时候代表应用程序退出了;
设计任务栈的目的:维护界面打开、关闭之间的关系的;
启动模式:
standar:标准模式,没打开一个界面都会创建一个实例放入任务栈中;
singleTop:单一顶部模式,
13_singletop启动模式
singletop 单一顶部模式 在activity的配置文件中设置android:launchMode="singleTop"
如果任务栈的栈顶存在这个要开启的activity,不会重新的创建activity,而是复用已经存在的activity。保证栈顶如果存在,不会重复创建。
应用场景:浏览器的书签
14_singletask和singleinstance启动模式
singetask 单一任务栈,在当前任务栈里面只能有一个实例存在
当开启activity的时候,就去检查在任务栈里面是否有实例已经存在,如果有实例存在就复用这个已经存在的activity,并且把这个activity上面的所有的别的activity都清空,复用这个已经存在的activity。保证整个任务栈里面只有一个实例存在
应用场景:浏览器的activity
如果一个activity的创建需要占用大量的系统资源(cpu,内存)一般配置这个activity为singletask的启动模式。webkit内核 c代码
singleInstance启动模式非常特殊, activity会运行在自己的任务栈里面,并且这个任务栈里面只有一个实例存在
如果你要保证一个activity在整个手机操作系统里面只有一个实例存在,使用singleInstance
应用场景: 电话拨打界面
帧动画(重点)
帧动画:有一组有序的图片,一帧一帧地显示这些图片;
代码:
iv = (ImageView) findViewById(R.id.iv);
//添加ImageView的背景资源
iv.setBackgroundResource(R.drawable.girl);
//加载动画资源
AnimationDrawable ad = (AnimationDrawable) iv.getBackground();
ad.start();