Android基础回顾之Activity

Activity:

是与用户交互的接口,Android系统是通过Activity栈的形式来管理Activity

1.Activity任务栈:

通过栈存储Activities,不在栈顶端,越是在栈底端,越是在内存不足状态下可能被系统销毁回收
四种形态:

  • Active:Activity处于栈顶,可见,能和用户交互
  • Paused:可见不可交互,失去焦点,会被新的非全屏的Activity挡住,此时失去和用户交互能力,但其数据,状态,成员变量都存在,正常状态下不会被回收,除非系统内存不足会被回收
  • Stopped:一个Activity被另外一个完全覆盖,不可见,进入stopped状态,但其数据,状态,成员变量都存在,正常状态下不会被回收,除非系统内存不足会被回收
  • Killed:系统回收掉

2.Activity生命周期:

Android基础回顾之Activity_第1张图片

正常状态下生命周期:

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具有独占性

你可能感兴趣的:(Android基础回顾之Activity)