Activity活动解析

一.返回栈:

启动活动时候,该活动会入栈,并且会处于栈顶的位置,调用finish()的方法,
该活动会出栈,使之前的活动显示出来。
效果图:

这里写图片描述

二.活动的状态

分为:
运行,暂停,停止,销毁。
创建:oncreate(创建)
运行:onstart(开始,活动可见),onresume(正在运行),onrestart(重新启动)
暂停,停止:onpause(正在停止),onstop(完全停止,活动不可见)
销毁:ondestroy(退出)
这里写图片描述

  1. Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。例如,如果您的Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,onDestroy() 中停止该线程。
  2. Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart()中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop()中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
  3. Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 —例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

来源 https://developer.android.google.cn/guide/components/activities.html#Lifecycle
启动:
这里写图片描述
这里写图片描述

点击按钮go to Main2:
这里写图片描述
点击返回:
这里写图片描述
退出:

这里写图片描述

三.活动的模式

standard,singleTop,singleTask,singleInstance(复杂)

四.保存Activity状态

当Activity暂停或者停止的时候,Activity的对象依然保存在内存中,使用onSaveInstanceState()可以保存和传递内容,
该方法内会有一个Bundle,为系统传递。
尤其在旋转屏幕的状态下。活动会销毁重建,会使原有的数据消失比如(EditText)的内容。
接下来验证:代码图

public static String TAG = "MainActivity";
EditText edit;
TextView getText;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.e(TAG, "onCreate");
    Button get = (Button)findViewById(R.id.get);
    edit = (EditText)findViewById(R.id.test_edit);
    getText = (TextView)findViewById(R.id.get_text);
    get.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getText.setText(edit.getText());
        }
    });
}

效果图:

这里写图片描述

点击按钮获取内容:

这里写图片描述

旋转屏幕:

这里写图片描述
发现内容消失。
这个时候就要用到onSaveInstanceState()的方法,不然肯定会影响到用户体验。
代码图:

public static String TAG = "MainActivity";
EditText edit;
TextView getText;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.e(TAG, "onCreate");
    Button get = (Button)findViewById(R.id.get);
    edit = (EditText)findViewById(R.id.test_edit);
    getText = (TextView)findViewById(R.id.get_text);
    if (savedInstanceState!=null){
        getText.setText(savedInstanceState.getString("content"));
        edit.setText(savedInstanceState.getString("content"));
    }
    get.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getText.setText(edit.getText());
        }
    });
}

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putString("content",edit.getText().toString());
    Log.e(TAG, "onSaveInstanceState: "+edit.getText().toString());
}

效果图
获取:

这里写图片描述

旋转后:

这里写图片描述

成功保存的当前活动的内容。

*发现了一个问题:在未加onsaveInstance的时候 旋转屏幕,editText的内容不会消失,而在使用该方法的时候,它的内容奇怪的消失了*

原因:

不过,即使您什么都不做,也不实现 onSaveInstanceState(),Activity 类的
onSaveInstanceState() 默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android:id属性)。如果小部件没有 ID,则系统无法保存其状态。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值