美文网首页
Activity解析

Activity解析

作者: 荞麦穗 | 来源:发表于2017-10-01 23:17 被阅读0次

    Activity四大组件之一,要在Manifiest文件里注册,主要用来显示View和与用户交互。


    4614633-da514db7eb83df65.png

    MVC模式:M(Model)所有的业务逻辑,如数据库操作,网络操作,V(View)视图,与用户交互的界面展示,
    C(Controller)控制层,就是众多Activity的管理,Activity主要是用来做控制的,业务逻辑尽量交给Model
    来处理。
    onCreate(Bundle icicle)做一些准备工作,分配类变量,绑定
    控件
    onStart()<- onRestart()
    OnRestoreInstanceState()
    onResume()
    OnSaveInstanceState()
    onPause()
    onStop()
    onDestroy()释放onCreate()中绑定的资源


    20160717151833576.png

    不设置Android:configChange时,切横屏是会调用一次,切竖屏时会调用两次
    Android:configChange=“orientation”切横竖屏是都只调用一次各个生命周期
    android:configchange="orientation|keyboardHidden"切屏是不会调用生命周期,只会调用onConfigurationChanged();

    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        if(this.getResource().getConfiguration.orientation==Configuration.ORIENTATION_LANDSCAPE/Configuration.ORIENTATION_PORTRAIT){}
    }
    android:screenOrientation="portrait|landscape"//固定横竖屏
    

    当创建Activity的时候,继承Activity时不带标题,如果继承AppCompatActivity时,后默认附带标题

    AppCompatActivity默认带标题
    requestWindowFeature(Window.FEATURE_NO_TITLE);//可以隐藏系统自带标题。
    

    Activity跳转

    Intent intent = new Intent(MainActivity.this,GoToActivity.class)
    //或者
    Intent intent = new Intent();
    intent.setClass(MainActivity.this,GoToActivity.class);
    
    startActivityForResult(intent,requestCode);
    startActivity(intent);
    

    MainActivity在处理回传结果的时候,调用此方法。

    onActivityResult(int requestCode,int resultCode,Intent data){}
    

    GoToActivity在设置回传的值的时候,使用intent;

    intent.putExtra(String key,String values);
    setResult(RESULT_OK,intent);
    
    Activity、Window、View的关系。

    Activity->Window->DecorView[WindowManager.addView()]->View
    Activity在onCreate之前调用 .attach()方法,将其添加到ActivityThread当中并且会创建window对象。window对象创建时并木有创建DecorView对象。用户在Activity中调用setContentView,然后调用window的setContentView,这时会检查DecorView是否存在,如果不存在则创建DecorView对象,然后把用户自己的View 添加到DecorView中。Activity创建好Window之后只要调用WindowManager 的 .addView() 方法来将Window的DocerView添加进去即可是使Window显示出来。
    系统在window中提供一个Canvas对象,DocerView通过调用 draw() 方法来将自己绘制到Canvas上。draw() 方法实际上是一个递归方法,他会循环调用孩子View的draw方法来完成整棵树的绘制。所以实际上一个界面的绘制所用的Cavans是同一个对象。

    栈内管理:遵循先进后出,而且Activity的状态跟其在栈内的位置有关,当系统资源不足的时候,先回收靠近栈底部的。

    从创建到销毁有四种状态:

    Activity可见,有焦点
    Paused没有全部遮挡使,无焦点,不可操作
    Stoped不可见,但是状态和信息还有保留
    Activity被杀死后或者启动前,已经被移除栈了

    四种启动模式:

    有没有存在过实力standard,singleTop,singleTask,singleinstance
    android:launchMode="";

    切换动画

    Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。
    overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
    它必需紧挨着startActivity()或者finish()函数之后调用"

    Activity之间通讯

    1、StartActivity(intent)/startActivityForResult(intent,0);

            Intent intent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putString("","");
            intent.putExtras(bundle);
            startActivity(intent);
    

    2、接口回调
    3、本地数据:SharePreference,数据库,内存序列化数据,全局数据
    4、本地广播:LocalBroadcastManager,IntentFilter
    5、第三方库:EventBus,RxBus等

    setResult()的调用时机

    Activity-A中用startActivityForResult()方法启动了Activity-B,并且在B中通过setResult()方法给A返回值,由于某些原因不能在setResult()之后立刻调用finish()函数,只能通过用户按Back键自己退出到A。Activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。而且必须要在onPause、onStop、onDestroy之前。
    实际使用场景:

    //1、重写onBackPressed()方法,捕获BACK事件,捕获到之后先setResult
    @Override
     public void onBackPressed()
     {
            Log.i(TAG, "onBackPressed");
            setResult(Const.LIVE_OK);
            super.onBackPressed();
     }
    //2、按点击事件中显式的调用finish()
    setResult(RESULT_OK);
    finish();
    

    相关文章

      网友评论

          本文标题:Activity解析

          本文链接:https://www.haomeiwen.com/subject/vaxzextx.html