Android四大组件-Activity
2015-11-13 17:48
411 查看
1、Activity的作用。
Activity这一个提供与用户交互的组件,展现在手机上的页面大部分是activity(fragment也可以说是activity的一部分),每一个activity都是一个窗口,在这个窗口和这个窗口中绘制的控件可以响应用户的点击事件。2、Activity生命周期的设计思想。
在google文档上这样描述:为了能在多个activity间提供流畅的用户体验,或为了处理那些导致activity关闭甚至销毁的意外中断情况,你应该要用到很多其它的生命周期回调方法。 所有这些activity生命周期回调方法都将在后面的管理Activity的生命周期部分进行论述。因此,activity的7种生命周期这样设计的目的主要是提高用户使用的流畅
3、Activity的四种启动模式。
activity的其他三种生命周期一般是很少用到的配置启动模式在AndroidManifest.xml的该activity中配置
launchMode=”standard”
<activity android:name="xxx" android:launchMode="standard" />
standard:默认值。系统在启动 activity 的 task 中创建一个新的 activity 实例,并把 intent 传送路径指向它。该 activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中也可以存在多个实例。
singleTop:如果 activity 已经存在一个实例并位于当前 task 的栈顶,则系统会调用已有实例的onNewIntent()方法把 intent 传递给已有实例,而不是创建一个新的 activity 实例。activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中可以存在多个实例(但仅当 back stack 顶的 activity 实例不是该 activity 的)。
比如,假定 task 的 back stack 中包含了根 activity A 和 activities B、C、D(顺序是 A-B-C-D;D 在栈顶)。
这时过来一个启动 D 的 intent。如果 D 的启动模式是默认的”standard”,则会启动一个新的实例,栈内容变为 A-B-C-D-D。
但是,如果 D 的启动模式是”singleTop”,则已有的 D 实例会通过onNewIntent():接收这个 intent,因为该实例位于栈顶——栈中内容仍然维持 A-B-C-D 不变。当然,如果 intent 是要启动 B 的,则 B 的一个新实例还是会加入栈中,即使 B 的启动模式是”singleTop”也是如此。
singleTask:只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
singleInstance:除了系统不会把其它 activity 放入当前实例所在的 task 之外,其它均与”singleTask”相同。activity 总是它所在 task 的唯一成员;它所启动的任何 activity 都会放入其它 task 中。
4、Activity生命周期,和生命周期中的工作。
onCreate();ctivity第一次被创建时调用。在这里你应该完成所有常见的静态设置工作——创建view、绑定list数据等等。本方法传入一个包含了该activity前一个状态的Bundle对象(如果之前已捕获了状态的话,详见后面的保存Activity状态)。onStart():activity要显示给用户之前调用。
onResume():开始与用户交互,响应用户事件:比如输入文字,点击按钮,
onPause()当系统准备启动另一个正在恢复的activity时调用。这个方法通常用于把未保存的改动提交为永久数据、停止动画播放、以及其它可能消耗CPU的工作等等。它应该非常迅速地完成工作,因为下一个activity在本方法返回前是不会被恢复运行的。并且弹出对话框也是在onPause()方法中
onStop() 处于关闭前的状态 ;
onRestart()在onStop()后, 可能走onRestart()—>onStart()
onDestory():销毁activity;
5、Activity销毁前如何保存数据?
在特别情况下,系统为了回收内存而要销毁Activity时,再次进入的时候就还要从onCreate()方法开始执行,在这个界面中的信息也就销毁了。但有时候我们还要保存一些用户的数据比如,选择的哪个选框,填写的一些数据。这时候就用到onSaveInstanceState()方法。@Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); }
当activity就得容易被销毁的时候,系统将自动调onSaveInstanceState()方法,传入一个Bundle对象,可以利putString()之类的方法,保存数据。你有没注意到我们在onCreate()方法,可能你一直在使用onCreate()方法,但是从来没注意和使用方法中的参数吧!
@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); }
在activity中传一个onCreate(Bundle svaeInstanceState)你就是对应的onSaveInstanceState()的Activity销毁时保存的Bundle携带的数据。如果在onSaveInstanceState()时保存了数据,在重新走onCreate()的时候就可以得到数据,则显示出来。
如果Bundle中没有保存的数据,哪么这个Bundle也就是null,我们刚创建activity的时候bundle就是null;
6、如何从其他地方返回数据到Activity中?
当activity启动另一个页面的时候,并且要求返回我们从另一个页面中得到的数据。这时候就用到了onActivityResult()方法,比如说我们系统的拍照功能,调用系统的拍照相机,得到图片返回。以拍照为例:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case TAKE_PICTURE: //将保存在本地的图片取出并缩小后显示在界面上 Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/image.jpg"); Bitmap newBitmap = ImageTools.zoomBitmap(bitmap, bitmap.getWidth() / SCALE, bitmap.getHeight() / SCALE); //由于Bitmap内存占用较大,这里需要回收内存,否则会报out of memory异常 bitmap.recycle(); //将处理过的图片显示在界面上,并保存到本地 iv_image.setImageBitmap(newBitmap); ImageTools.savePhotoToSDCard(newBitmap, Environment.getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis())); break; case CHOOSE_PICTURE: ContentResolver resolver = getContentResolver(); //照片的原始资源地址 //得到的是一个uri; Uri originalUri = data.getData(); try { //使用ContentProvider通过URI获取原始图片 Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, originalUri); if (photo != null) { //为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存 Bitmap smallBitmap = ImageTools.zoomBitmap(photo, photo.getWidth() / SCALE, photo.getHeight() / SCALE); //释放原始图片占用的内存,防止out of memory异常发生 photo.recycle(); iv_image.setImageBitmap(smallBitmap); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break; default: break; } } }
7、如何在一个Activity中销毁另一个Activity?
定义类的静态引用:public static MainActivity mainInstance;在onCreate()方法中,将这个类指向这个引用:mainInstance=this;
在关闭的地方调用 MainActivity.mainInstance.finish();
在onDestory()中置空;
在MainActivity中代码代码:
public class MainActivity extends Activity { public static final String TAG="MainActivity"; public static MainActivity mainInstance; private Button btn_second; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainInstance=this; btn_second= (Button) findViewById(R.id.btn_second); btn_second.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } @Override protected void onDestroy() { super.onDestroy(); mainInstance=null; Log.i(TAG,"MainActivity close"); } }
在关闭的activity代码:
public class SecondActivity extends Activity { private Button btn_close; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); btn_close= (Button) findViewById(R.id.btn_close); btn_close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MainActivity.mainInstance.finish(); } }); } }
相关文章推荐
- Android 仿QQ个人标签的添加(重复判断)与删除
- Android从相册和照相机获取图片
- Debugging RxJava on Android
- Android基础入门教程——10.10 传感器专题(1)——相关介绍
- Activity与Fragment切换动画
- Android之zxing二维码生成于识别
- Android-Universal-Image-Loader最新框架解析
- 【Android学习笔记】Android中的进程和线程
- Android 打印小结
- Android属性动画LayoutTransition(布局容器动画)
- android四大组件之Service
- Activity全透明
- Android平台接入Facebook登录
- 欢迎使用CSDN-markdown编辑器
- 为android textview添加scrollbar
- Intent Resolving in Android M
- Android实现本地上传图片并设置为圆形头像
- Android 读取SD卡中的text文件内容
- 【Android学习笔记】Intent详解
- Android 调用js,传对象到js里面使用addJavascriptInterface错误总结