Android基础回顾之Activity
2018-09-04 本文已影响0人
Man不经心
Activity:
是与用户交互的接口,Android系统是通过Activity栈的形式来管理Activity
1.Activity任务栈:
通过栈存储Activities,不在栈顶端,越是在栈底端,越是在内存不足状态下可能被系统销毁回收
四种形态:
- Active:Activity处于栈顶,可见,能和用户交互
- Paused:可见不可交互,失去焦点,会被新的非全屏的Activity挡住,此时失去和用户交互能力,但其数据,状态,成员变量都存在,正常状态下不会被回收,除非系统内存不足会被回收
- Stopped:一个Activity被另外一个完全覆盖,不可见,进入stopped状态,但其数据,状态,成员变量都存在,正常状态下不会被回收,除非系统内存不足会被回收
- Killed:系统回收掉
2.Activity生命周期:
正常状态下生命周期:
oncreate(创建)
|
onstart(可见不可交互)
|
onresume(可见并且可以交互)Activty处于Active状态
|
onPause
|
onstop(不可见后台运行)--(应用切换到前台)-->onRestart-->onStart...
|
onDestroy(正在被销毁)
异常状态下生命周期处理:
多了两个方法:onSaveInstanceState(异常终止状态保存)和onRestoreInstanceState(数据恢复)
总结
- Activity正常启动:oncreate-onstart-onresume
- 点击back回退:onpause-onstop-ondestroy
- 打开新的Activity:onPause-onStop
- Activity异常:onSaveInstanceState保存数据
- Activity重新创建:调用onRestoreInstanceState恢复数据
3.Activity之间通信
- Intent/Bundle
key:value
- 类静态变量
public static String NAME = “”;
- 全局变量
Constant.NAME;
4.Activity将数据传递给Fragment:
- Bundle
fragment.setArguments(bundle);
- 直接在Activity中定义方法
Activty中定义方法,fragment onAttach中强转Activity并获取其方法getxxx();
5.Fragment将数据传递给Activity
- EventBus
- 接口回调
1.在fragment中定义一个内部回调接口
2.fragment中onAttach()
3.调用onDetach方法,这个时候要把传递进来的Activtity对象释放掉
//Fragment
public class Fragment3 extends Fragment implements View.OnClickListener {
// 2.1 定义用来与外部activity交互,获取到宿主activity
private FragmentListener listener;
// 1 定义了所有activity必须实现的接口方法
public interface FragmentListener {
void process(String str);
}
// 当Fragment被加载到activity的时候会被回调
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if(activity instanceof FragmentListener) {
listener = (FragmentListener)activity; // 2.2 获取到宿主activity并赋值
} else{
throw new IllegalArgumentException("activity must implements FragmentListener");
}
}
@Override
public void onClick(View v) {
listener.process("我是接口"); //3.1 执行回调
}
//把传递进来的activity对象释放掉,保证不会内存泄漏
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
}
//Activity
public class FragmentActivity3 extends Activity implements Fragment3.FragmentListener {
@Override
public void process(String str) {
//todo
}
}
6.Activity与Service数据通信
- 绑定服务,利用ServiceConnection类
- 简单通信,利用Intent进行传值
//Activity
intent = new Intent(ServiceActivity.this, MyService.class);
intent.putExtra("data","data");
startService(intent);
//Service
onStartCommand()
data = intent.getStringExtra("data");
- 定义一个callback接口来监听服务中的进程的变化
7.Activity启动模式:
singleTop和standard都不会创建新的任务栈
- standard:
1.在不指定启动模式的前提下,系统默认使用该模式
2.每次启动一个Activity都会重写创建一个新的实例
3.每一次被创建生命周期方法都会被调用
- singleTop:栈顶复用,场景:IM对话框,新闻客户端推送
1.如果已经在栈顶的话,会重新复用这个Activty并调用onNewIntent(可以用来刷新数据)
2.如果当前栈中已有该Activity实例,但是没有在栈顶,会创建新的Activity
3.当前栈中不存在该Activity的实例时,同standard
- singleTask:栈内复用,单例 场景:应用的主界面
1.首先会根据taskAffinity(任务相关性)去寻找当前是否存在一个对应名字的任务栈
2.如果不存在,则会创建一个新的Task,创建一个新的Activity,入栈
3.如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例,如果存在,则将其上方的Activity都销毁,回调onNewIntent
- singleInstance:独自占有一个任务栈,且将activity放在该任务栈中,应用场景:呼叫来电
1.以singleInstance模式启动的Activity具有全局唯一性
2.如果在启动这样的Activity时,已经存在了一个实例
3.以SingleInstance模式启动的Activity具有独占性