探究Activity
2017-03-03 本文已影响20人
GoBg
Activity的基本使用
- 1.手动创建Activity
- 自定义class继承 appCompatActivity或是其他Activity类
- 通过setContentView("布局")为Activity添加布局文件
- 在AndroidManifest.xml 注册改 Activity
- 2.在Activity中使用Toast
- Toast.makeText("上下文,Context的子类","显示的字符串",Toast.LENGTH_SHORT).show();
- 3.在Activity中使用Menu
- 创建item菜单
- 在Activity中重写onCreateOptionsMenu(Menu menu),加载资源文件到menu上,当返回值为true 的时候 menu 才会显示
- 4.销毁Activity
- Activity中调用 finish() 销毁当前的Activity
Intent的使用
- 显式Intent
- 显式Intent ,顾名思义 是指确切的知道将要打开的Activity,
- 使用方式,new Intent(Context, NextActivity.class);
- 隐式Intent
- 隐式Intent ,是指在没有确定知道要跳转的Activity,使用了一系列的action,category,由系统去分析这个Intent,找到合适的Activity并启动
- 在activtiy指定了action 或是categroy 时,启动Activity的Intent必须都与该Activity参数都一一对应时候才会启动该Activity
- category 的默认参数一般不用写,也可以启动
- 比如启动系统浏览器打开百度
- Intent intent=new Intent(Intent.ACTION.VIEW);
- intetn.setData(Uri.parse("http://www.baidu.com"))
- staetActivity(intent);
- 比如启动打电话
- Intent intent=new Intent(Intent.ACTION.DLAL);
- intent.setData(Uri.parse("tel:10086"));
- startActivity(intent);
- 向下一个Activity传递参数
- 传递参数可使用intent.putExtra("KEY","value")
- 该方法重载,可以传递多种数据类型
- 可以使用传递Bundle对象
- 要想传递其他的对象类型的参数的时候,该类必须实现Serializable 或者 Parcelable
- 在启动的Activity 中通过 getIntent() 获取Intent对象
- 在通过intent对象,获取传递过来的参数,比如传递额String类型的参数,就通过intent.getStringExtra("KEY")
- 传递的整数,就通过intent.getIntExtra("KEY");
- 返回数据给上一个Activity
- 在返回给上一个Activity参数中用到的是一个requesCode 和一个 resultCode
- requestCode用于标记是从哪个Activiyt启动的
- resultCode用于标记是从哪个Activity返回的
- 在需要返回个上一个Activty数据这种情况的时候,启动Activity的方式就不是原来的startActivity(intent)了
- 具体使用
- ActivityOne startActivitForResutl(intent,requestCode) requestCode 随意指定,但一定要唯一
- ActivityTwo setResult( resultCode ,intent); finish; resultCode 随意指定,但一定要唯一
- 当ActivityTwo 销毁的时候就会调用ActivityOne 中的onActivityResult(int requestCode,int resultCode,Intent data)
- 在判断requestCode 和 resultCode 都准确无误的情况下,就可以使用date.getStringExtra("KEY"),获取返回的数据
Activity 的生命周期
- 完整的生命周期
- onCreate() > onStart() > onResume > onPause() > onStop() > onDestroy()
- onRestatrt();
- 不同状态下的方法回调
- 启动ActivityOne onCreate() > onStart() > onResume();
- 在ActivityOne 中启动 ActivityTwo ActivityOne 中会调用 onPause() > onStop()
- 从ActivityTwo 中返回 ActivityOne ActivityOne中会调用onRestart() > onStart() > onResume();
- 在ActivtiyOne中按下返回键时 ActivityOne 中会调用onPause() > onStop() > onDestroy();
- 如果在新打开的Activity没有完全的遮挡住下面的Activity的时候, 下面的Activity只会回调 onPause(),还是属于可见的状态,再次返回的时候也只是会回调onResume()
- Activity的被销毁时的数据存储
- 当手机的内存不足的情况下,会销毁处于停止状态的Activity.为了优化用户体验, 所以这时数据的保存就显得尤为重要.
- 在Activity销毁的时候必然会调用onSaveInstaceState(Bundle outState),可以通过bundle 以键值对的形式传递参数,
- 当Activity再次重新创建的时候调用的onCreate(Bundle onSaveInstaceState) 取出Bundle所携带的参数
- 因为第一次创建Activity的时候没有返回的参数,所以要在这里判断Bundle是否为null之后在进行下一步操作
Activity 的启动模式
- standard 每一Activity 默认的启动模式,是以先进后出的结构进行,每次打开一个新的Activity都会重新创建
- singleTop 单栈顶模式,在启动一个Activity时候判断是否在栈顶,如果不再栈顶,就会重新创建一个新的Activity实例,如果在栈顶,就会复用该栈顶的Activity 实例.
- singleTask 单任务栈模式, 再打开一个新的Activity的时候会判断该Activity是否在该任务栈存在,如果存在,就选择复用,不存在就会新创建一个Activity的实例
- singleInstance 单独的返回栈管理一个Activity
Activity 的最佳实践
- 知晓当前在那个Activity
- 创建BaseActivity 在onCreate()中调用getClass().getSimpleName(), 让所有的Activity都继承BaseActivity
- 安全的退出Activity
- 创建ActivtiController . 添加addActivity(Activity activity) 并在BaseActivity 的onCreate() 中调用
- 添加removeActivity(Activity activity) 在BaseActivity的onDestroy()中调用
- 创建finishAllActivity() 在需要关闭所有Activity的地方调用即可
- 启动Activity的最佳写法
- 将打开Activity所需要用到的参数,以方法的形式封装,只把需要用到的参数对外暴露,简单,明了