Android从源码分析问题--Activity(未完待续)

238 阅读4分钟

前言 了解

什么是Activity

官方源码解释:几乎所有的Activity都与用户交互,因此Activity类负责为您创建一个窗口,您可以用setContentView将UI设置到该窗口中。通常显示都是全屏,但也可以用浮动窗口的形式或者(内嵌到一个ActivityGroup中)【小括号内的ActivityGroup,在源码中已经说明被弃用,而代替它的是Fragment】

个人解释为Activity就是Android的“脸面”,就是显示给操作者看的。

活动的几乎所有子类都有两种实现方法:

  • onCreate 是初始化活动的地方。最重要的,通常调用setContentView,定义用户界面的布局资源,并使用findViewById检索用户界面中需要交互的控件。
  • onPause 是处理用户离开Activity的地方。最重要的是,用户在这一点上所做的任何更改都应提交。

一个Activity基本有四种状态:

  • 如果一个活动在屏幕的前部(在堆栈的顶部),此时是 运行状态
  • 如果一个活动失去焦点,但仍然可见(即,一个新的非全尺寸或透明的活动集中在您的活动的顶部),此时是 暂停状态。暂停的活动是完全活着的(它保持所有状态和成员信息并保持连接到窗口管理器),但是可以在极端低内存情况下被系统杀死。
  • 如果一个活动被另一个活动完全遮蔽,此时是 停止状态。它仍然保留所有的状态和成员信息,但是,用户不再可见,因此它的窗口是隐藏的,当需要内存时,系统会经常被系统杀死。
  • 如果一个活动被暂停或停止,系统可以通过请求它完成,或者简单地杀死它的进程来从内存中删除该活动。此时为 回收销毁状态。当它再次显示给用户时,必须完全重新启动并恢复到其以前的状态。

Activity的生命周期

  • onCreate 一 首次创建Activity后调用(创建视图,绑定数据到列表)
  • onStart 一 当Activity对用户可见时调用
  • onRestart 一 当Activity被停止后,重新启动该Activity时调用
  • onResume 一 当Activity准备与用户交互时调用,此时Activity位于栈顶
  • onPause 一 当用户离开该Activity时调用,通常用于将未保存的更改提交到持久性数据、停止动画和其他可能消耗CPU的事物
  • onStop 一 当用户不可见该Activity时调用(另一个Activity已经恢复并覆盖该Activity时调用,另一个新的Activity启动,或是被回收
  • onDestroy 一 当Activity结束调用(用户调用finish,结束该Activity,或者是系统为了节省空间进行了回收)

两个Activity之间的通信

1 startActivityForResult

有时候,启动一个Activity,允许用户在联系人列表中选择一个人;当它结束时,它返回所选的人。使用startActivityForResult(intent, 整数参数标识),通知第二个Activity,在onActivityResult获取处理返回得到的参数

public class FirstActivity extends AppCompatActivity {

    static final int REQUEST_CODE = 1;
    private TextView content_tv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        content_tv = findViewById(R.id.content_tv);
    }

    public void toSecondClick(View view) {
        startActivityForResult(new Intent(this, SecondActivity.class), REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            if (!TextUtils.isEmpty(data.getStringExtra("data"))) {
                content_tv.setText(data.getStringExtra("data"));
            }
        }
    }
}
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
    
    public void toFirstClick(View view) {
        Intent intent = new Intent(this, FirstActivity.class);
        intent.putExtra("data", "这是SecondActivity返回的数据!");
        setResult(RESULT_OK, intent);
        finish();
    }
}

2 Intent

3 Broadcast

4 使用静态值

5 文件、SQLite、contentProvider

6 livedata+viewmodel

Activity的4个进程状态

  • 前台活动,最重要的,该进程作为最后的一个可被杀死的进程
  • 可见活动,用户可以看到但不在前景中的活动,例如坐在前景对话框后面的活动被认为是极其重要的,除非保持前台活动的运行,否则不会被杀死。
  • 后台活动,对用户不可见且已暂停的活动不再重要,因此系统可以安全地杀死其进程以回收其他前景或可见进程的内存。如果其进程需要被杀死,当用户导航回活动(使它在屏幕上再次可见)时,它的onCreate方法将被调用它以前在savedInstanceState中提供的onSaveInstanceState以便它可以在相同的情况下重新启动它自己。这样它就可以在用户上次离开的状态下重新启动它自己。
  • 空进程,当内存变低时,这些系统会很快被杀死。