天天看点

Android四大组件-Activity1、Activity的作用。2、Activity生命周期的设计思想。3、Activity的四种启动模式。4、Activity生命周期,和生命周期中的工作。5、Activity销毁前如何保存数据?6、如何从其他地方返回数据到Activity中?

1、Activity的作用。

Activity这一个提供与用户交互的组件,展现在手机上的页面大部分是activity(fragment也可以说是activity的一部分),每一个activity都是一个窗口,在这个窗口和这个窗口中绘制的控件可以响应用户的点击事件。

2、Activity生命周期的设计思想。

在google文档上这样描述:为了能在多个activity间提供流畅的用户体验,或为了处理那些导致activity关闭甚至销毁的意外中断情况,你应该要用到很多其它的生命周期回调方法。 所有这些activity生命周期回调方法都将在后面的管理Activity的生命周期部分进行论述。

因此,activity的7种生命周期这样设计的目的主要是提高用户使用的流畅

3、Activity的四种启动模式。

任务栈:任务栈是用来放置Activity实例的容器,以栈的形式盛放,也就是所谓的先进后出,压栈和弹栈操作。

任务栈的作用:确保Activity的启动和退出有一定的顺序,防止Activity启动的混乱。比如说,我们app中一个Activity中调用系统拍照,牌子后点击返回,该回到哪个界面中呢(如果返回相机中的某个界面,用户会感觉到很奇怪)

配置启动模式在AndroidManifest.xml的该activity中配置

launchMode=”standard”

<activity  
    android:name="xxx"  
    android:launchMode="standard" />  
           

1、标准模式 standard

standard:默认值。在这种模式下,如果不断启动相同的activity,会产生多个相同的实例。activity不断的叠加。

2、标准模式 singleTop

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”也是如此。

3、singleTask

只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。

4、singleInstance

除了系统不会把其它 activity 放入当前实例所在的 task 之外,其它均与”singleTask”相同。activity 总是它所在 task 的唯一成员;它所启动的任何 activity 都会放入其它 task 中。

4、Activity生命周期,和生命周期中的工作。

  1. onCreate();ctivity第一次被创建时调用。在这里你应该完成所有常见的静态设置工作——创建view、绑定list数据等等。本方法传入一个包含了该activity前一个状态的Bundle对象(如果之前已捕获了状态的话,详见后面的保存Activity状态)。
  2. onStart():activity要显示给用户之前调用。
  3. onResume():开始与用户交互,响应用户事件:比如输入文字,点击按钮,
  4. onPause()当系统准备启动另一个正在恢复的activity时调用。这个方法通常用于把未保存的改动提交为永久数据、停止动画播放、以及其它可能消耗CPU的工作等等。它应该非常迅速地完成工作,因为下一个activity在本方法返回前是不会被恢复运行的。并且弹出对话框也是在onPause()方法中
  5. onStop() 处于关闭前的状态 ;
  6. onRestart()在onStop()后, 可能走onRestart()—>onStart()
  7. onDestory():销毁activity;
Android四大组件-Activity1、Activity的作用。2、Activity生命周期的设计思想。3、Activity的四种启动模式。4、Activity生命周期,和生命周期中的工作。5、Activity销毁前如何保存数据?6、如何从其他地方返回数据到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?

  1. 定义类的静态引用:public static MainActivity mainInstance;
  2. 在onCreate()方法中,将这个类指向这个引用:mainInstance=this;
  3. 在关闭的地方调用 MainActivity.mainInstance.finish();
  4. 在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();
            }
        });
    }
}