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();
网友评论