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

前言

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

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

思惟导图

生命周期

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

(1)onPause()onStop()post

(2)onStart()onResume()学习

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

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

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

启动模式

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

事件分发机制

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

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

其实个人思考主要是由于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()进行置空操做、或是解绑这一类方法把。

以上就是个人学习成果,若是有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。


相关文章推荐:

Android必知必会的四大组件 -- Broadcast Receiver篇

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

Glide都在用的LruCache,你会几分?

相关文章
相关标签/搜索