Activity组件之间跳转:
1. 显式意图.(一般使用显式意图 都是在自己的项目中.)
一般用在, 知道某一个类名, 并且可以引用到那个类的字节码.
使用最多的: Intent intent = new Intent(this, SecondActivity.class);
2. 隐式意图.(一般适用在不同应用程序之间界面的跳转, 例如: 拨号 器.)
不知道类名, 也不知道包名. 但是知道了那个页面的动作action:Intent.ACTION_CALL;
描述隐式意图时, 如果需要添加intent.addCategory("android.intent.category.DEFAULT");
可以不用添加. 默认值就是已经添加了的"android.intent.category.DEFAULT"
Uri 和 URL
Uri 统一资源标识符
URL 统一资源定位符.
隐式跳转时, 设置data和type时, 需要一起设置, 单独设置会把某一个先设置的值置null.
setDataAndType(data, type);
Activity页面之间传递和回传数据:
传递数据: 页面传递数据时, 不建议传递过多的数据. 会影响用户体验效果.
// 第一种, 可以传递八大基本类型
intent.putExtra("name", name);
// 第二种, 可以传递八大基本类型, 使用一个Bundle(数据捆, map集合)对象封装起来. 便于数据多的情况下区分数据.
Bundle value = new Bundle();
value.putString("bundle_name", name);
intent.putExtra("bundle1", value);
startActivity(intent);
// 第三种, 想传递一种自己定义的对象 Person
Person person = new Person();
person.setName(name);
intent.putExtra("person", person);
回传数据:
1. 在开启界面时, 需要调用的方法是: startActivityForResult(intent, 999);
2. 当被开启的页面关闭时, 调用了setResult(888, data);方法.
3. 在第一个页面中的onActivityResult方法中取数据.
Activity生命周期:
onResume 获取焦点, 当前的activity可以直接跟用户进行交互.
onPause 暂停. 当前没有获取焦点. 当前activity可以被看到.
当开一个activity把前一个activity给完全盖住时, 会执行onPause -> onStop
当activity处于onStop状态时, 这时候盖住它的activity被关闭, 当前的actiivty就会被显示出来: onRestart -> onStart -> onResume
当前activity开启一个界面, 被开启的界面没有完全的把前一个界面盖住, 前一个界面的生命周期是: onResume -> onPause
当activity处于onPause状态时, activity上面页面被关闭了, 当前的activity被显示了, 生命周期: onPause -> onResume
总结: 如果当前的activity处于onResume, 当前的activity可以直接和用户交互.
应用场景: 在onPause中暂停的刷新操作, 重新开启.
如果当前的activity处于onPause, 当前的activity可以看见一部分, 但是不可以直接和用户操作.
应用场景: 在此状态可以停止一些页面动态刷新的状态.
onCreate 界面刚开始创建时执行.
应用场景: 一些初始化操作放在这里(加载控件, 抓取数据)
onDestory 界面销毁时执行.
应用场景:销毁占用的资源. 释放内存.
activity的启动模式.
1. "standard" (the default mode) 标准模式(activity默认的模式),
当调用startActivity方法开启界面, 会实例化多个实例在任务栈中, 相互不影响.
问题: 会在任务栈中实例化多个对象. 重复的太多. 容易内存溢出.
2. "singleTop" 单顶部模式.
如果被开启的activity已经在任务栈的顶部, 这时候不会创建一个新的实例, 而是调用栈顶activity的onNewIntent方法.
如果当前任务栈中已经有被开启的activity, 但是不在顶部, 这时候会创建一个新的实例在任务栈中.
应用场景: 有些流氓程序员, 攻击我们程序, 不停的开启页面, 就采用单顶部模式就可以解决.
3. "singleTask" 单任务栈.
如果被开启的activity已经存在任务栈中, 那调用startActivity方法开启此页面时, 不会再创建一个新的实例, 调用onNewIntent方法.
而是把当前的activity显示出来(提到栈顶), 同时, 会把当前任务栈中activity以上的所有activity全部清除出栈.
如果说当前的activity已经在栈顶, 直接调用onNewIntent方法.
应用场景: 一般应用在页面加载非常庞大时, 非常消耗资源. 只想初始化一次就够了, 以后不想再初始化实例, 就采用singleTask模式.
4. "singleInstance". 单一实例.
如果被开启的activity没有实例化过对象, 调用startActivity开启页面时, 会创建一个新的任务栈给activity使用,
并且当前任务栈只有它自己存在, 其它的activity不会在此任务栈中创建新的实例.
如果被开启的activity已经实例化过, 那么会调用onNewIntent方法.
在整个系统中, 无论哪一个应用程序开启当前采用singleInstance的activity,
如果已经实例化过, 那么始终都是调用的同一个activity, 而且是在同一个任务栈中.
应用场景: 需要常驻系统中的页面采用这种方式.