Android必知必会的四大组件 -- Activity篇

1,642 阅读4分钟

前言

先出一个题吧,Activity A 跳转Activity B,再从Activity B按back键回退,两个过程各自的生命周期?

这是一个比较简单的生命周期问题,但是很多人会答错。那我们就对整个生命周期进行一个分析,再给出答案好了。并且文章内有一些内容我已经写过了,都是通过给出链接方式跳转查看了,请见谅。

目录

思维导图

生命周期

这儿重点要知道的是下面这两对各自之间的区别的区别。

(1)onPause()onStop()

(2)onStart()onResume()

onPause()说明当前的Activity已经暂停,但你并不是说暂停的意思只是没有了动作,而调用了onStop()才让Acivity不可见。onStart()也是一样,只是说Activity已经可以启动了,但这个时候页面还是不可见的,只有调用了onResume()页面才能够可见,页面跳转也是如此。

现在在回答一下之前的问题,Activity A 跳转Activity B,再从Activity B按back键回退,两个过程各自的生命周期?

  1. Activity A 跳转Activity B: Apause -> Bcreate -> Bstart -> Bresume -> Astop
  2. Activity B再按back键回退: Bpause -> Arestart -> Astart -> Aresume -> Bstop -> Bdestroy

启动模式

详见于几张图让你明白Android四大启动模式

事件分发机制

详见于Android事件分发机制,你了解过吗?

这里说一下为什么我要把这个模块放在Activity,明明这个机制涉及的有三方ActivityViewGroupView

其实我的思考主要是因为Activity是接受到这些动作的第一人,而不管是ViewGroup还是View,都是后来经过一个事件的分发后,才有的他们的处理,所以我将事件分发机制归结于此。

Activity之间的数据传输

Activity的跳转之间,其实存在很多需要带上数据的情况。举个例子来说,就像是从Activity A一个新闻列表中选取了一条新闻,那这个时候就需要跳转进入Activity B,而查询新闻的方式我们就假设是他的id那这个时候,就需要将这个idActivity A送到Activity B中。

其实这种方式有很多,但是最普遍进行使用的莫过于putExtra(key, value)了。

使用方法

// 1. 定义跳转页面
Intent intent = new Intent(this, SecActivity.class);
// 2. 将数据放到Intent中
intent.putExtra("parameter key", "parameter value");
// 3. 启动页面
//      |-- 不带回传方法
startActivity(intent);
//      |-- 带回传方法
startActivityForResult(intent, REQUEST_CODE);

这里要注意的一个问题就是,如果想要接受到返回的数据,那我们就存在必须重写的方法,通过下方模版即可完成。

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode == REQUEST_CODE){
            // 进行相应的处理
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

完成了页面跳转和参数传递,那我们接下来要干啥?当然是拿到这些参数了!!!

getIntent().getStringExtra(key);
getIntent().getBooleanExtra(key);
// 。。。。。。

实在太多了,我就不一一列举了。那我们就出现问题了getIntent()哪儿来的,传递靠的是什么机制??,因为我们的接收还没讲完,所以我们这个问题先保留。

因为我们说过一个事情存在回调,我们应该要怎么做的问题。

// 通过setRsult()方法,来进行一个数据的回传
setResult(resultCode);
setResult(resultCode, intent);

// 模版,setResult()方法二选一
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
        // 说明是一个返回事件
        if (keyCode == KeyEvent.ACTION_DOWN && event.getAction() == KeyEvent.ACTION_DOWN) {
            Intent intent = new Intent();
            intent.putExtra("parameter key", "parameter value");
            // setResult(resultCode);
            setResult(resultCode, intent);
        }

        return super.onKeyDown(keyCode, event);
    }

Activity之间跳转,Intent的设置

你可能想说博主怎么这么多问题???哈哈哈哈哈!一起来探讨一下呗,反正我也刚想知道。

public Intent getIntent() {
        return mIntent;
    }

我们去ActivitystartActivity(intent)跳转过程中去查询,当然代码太多了,我就直接总结好了。

startActivity() --> startActivityForResult() --
--> Instrumentation.execStartActivity() --> IActivityTaskManager.startActivity() --
--> 进入了一个.aidl文件然后我也不知道了,但是肯定是在这里办正事儿的

探索发现:

(1)我们的数据,也就是Intent中使用putExtra(key, value)放置的数据最后都被封装进了Bundle,所以说Bundle其实就是我们Activity之间数据传递的媒介。

(2)而Activity的跳转也是基于一个Binder的机制来完成的,当然问我为啥呢。我也只能说因为包里找不到,基本上只会是.aidl文件,然后结合以前看的网上的解析都是说基于Binder的机制。

当然我的问题并没有解决,等我以后知识储备够了再来分析一下底层。

总结

其实上面都讲的差不多了,这里说一个实际会碰到的问题把。

就是staticHandlerServiceConnection这一类可能会引发的内存泄漏问题。他们存在解决方法,其实多种多样,但更多一般也都是基于生命周期来完成的。一般解法都是在onDestroy()进行置空操作、或是解绑这一类方法把。