您的位置:首页 > 移动开发 > Android开发

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();
}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: