Android心得2.4--四大组件之一--Activity

1.Android四大组件之一----Activity

     情况一:点返回后退时,发生一个完整的生命周期。

  创建:onCreate;

  开始:onStart;

  重新开始:onResume;

 

     点返回键

  暂停:onPause;

  停止:onStart;

  销毁:onDestory:

 

     情况二:来了一个电话或不小心点了home键返回了主屏幕。

  创建:onCreate;

  开始:onStart;

  重新开始:onResume;

 

     来了一个电话或不小心点了home键

  暂停:onPause;

  停止:onStart

 

     通话结束,或又重新进入这个Activity

  重新开始:onResume;

开始:onStart;

  重新开始:onResume;

2.Activity有四个状态:

l     当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响应用户操作的Activity。

l     当它失去焦点但仍然对用户可见时(如右图),它处于暂停状态。即在它之上有另外一个Activity。这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停的Activity仍对用户可见。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个Activity。

l     完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。

l    销毁状态:activity结束。

当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:

voidonCreate(Bundle savedInstanceState)

voidonStart()

voidonRestart()

voidonResume()

voidonPause()

voidonStop()

voidonDestroy()

3.这七个方法定义了Activity的完整生命周期。实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环:

l    Activity完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程,而在 onDestroy()销毁线程。

 

l     Activity可视生命周期自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。

 

l     Activity前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方法。关于前台生命周期循环的例子请见PPT下方备注栏。

4.Activity的前台生命周期循环例子:

 

1》创建一个Activity,添加七个生命周期方法,方法内输出各个方法名称。再添加一个按钮用于打开下面新添加的Activity。

    startActivity(new Intent(LifeActivity.this,CustomDialogActivity.class));

 

2》添加一个新Activity,代码如下:

publicclass CustomDialogActivity extends Activity {

    @Override protected void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        //必须在调用setContentView()之前调用requestWindowFeature()

        requestWindowFeature(Window.FEATURE_LEFT_ICON);//要标题栏显示图标

       setContentView(R.layout.dialog_activity);      //设置视图

       getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,android.R.drawable.ic_dialog_alert);//设置图标

    }

}

3》在AndroidManifest.xml文件配置Activity,并且通过主题指定该Activity以对话框样式显示。

 

        .....

        对话框activity"

   android:theme="@android:style/Theme.Dialog"/>

 

5.Activity创建图解

                                

6.对话框通知(DialogNatification

当你的应用需要显示一个进度条或需要用户对信息进行确认时,可以使用对话框来完成。

下面代码将打开一个如右图所示的对话框:

newAlertDialog.Builder(context)

   .setTitle("java培训")

   .setCancelable(false) //设置不能通过“后退”按钮关闭对话框

   .setMessage("浏览传智播客网站?")

   .setPositiveButton("确认",

      new DialogInterface.OnClickListener(){

      public void onClick(DialogInterfacedialoginterface, int i){

             Uriuri = Uri.parse("http://www.itcast.cn/");//打开链接

             Intent intent = new Intent(Intent.ACTION_VIEW,uri);

             startActivity(intent);

         }

   })

   .setNegativeButton("取消", newDialogInterface.OnClickListener() {

             public void onClick(DialogInterface dialog,int id) {

                       dialog.cancel();

              }

      })

       .show();//显示对话框

上面代码采用的是一个链式调用,像setTitle()、setMessage()这些方法,他们的返回值都是当前对话框对象。

android:name属性值的前面加了一个点表示NewActivity是当前包cn.itcast.action下的类,如果类在应用的当前包下,可以省略点符号,如果类在应用的子包下必须加点,如:NewActivity类在cn.itcast.action.user包下可以这样写:

7.Android传参问题

在一个Activity中可以使用系统提供的startActivity(Intent intent)方法打开新的Activity,在打开新的Activity前,你可以决定是否为新的Activity传递参数:

(1打开新的Activity ,不传递参数

publicclass MainActivity extends Activity {

  protected void onCreate(Bundle savedInstanceState){  .......

   Button button =(Button)this.findViewById(R.id.button);

                          button.setOnClickListener(new View.OnClickListener(){//点击该按钮会打开一个新的Activity

      public void onClick(View v) {

                          //新建一个显式意图,第一个参数为当前Activity类对象,第二个参数为你要打开的Activity类

         startActivity(new Intent(MainActivity.this, NewActivity.class));

   }});

         }

}

(2)打开新的Activity,并传递若干个参数给它:

publicclass MainActivity extends Activity {

protectedvoid onCreate(Bundle savedInstanceState) {

    button.setOnClickListener(newView.OnClickListener(){//点击该按钮会打开一个新的Activity

            public void onClick(View v) {

             Intent intent = new Intent(MainActivity.this, NewActivity.class)

Bundlebundle = new Bundle();//该类用作携带数据

bundle.putString("name","传智播客");

bundle.putInt("age",4);

intent.putExtras(bundle);//附带上额外的数据

startActivity(intent);

   }}); }

}

在新的Activity中接收前面Activity传递过来的参数:

publicclass NewActivity extends Activity {

            @Override protected voidonCreate(Bundle savedInstanceState) {

        ........

       Bundle bundle = this.getIntent().getExtras();

       String name = bundle.getString("name");

                      int age = bundle.getInt("age");

            }

}

8.得到新打开Activity关闭后返回的数据

如果你想在Activity中得到新打开Activity 关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity 传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int requestCode,int resultCode, Intent data)方法:

publicclass MainActivity extends Activity {

      @Override protected void onCreate(BundlesavedInstanceState) {

   Button button =(Button)this.findViewById(R.id.button);

   button.setOnClickListener(newView.OnClickListener(){

//点击该按钮会打开一个新的Activity

      public void onClick(View v) {

      //第二个参数为请求码,可以根据业务需求自己编号

      startActivityForResult (newIntent(MainActivity.this, NewActivity.class), 1);

   }});

         }

    //第一个参数为请求码,即调用startActivityForResult()传递过去的值;第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity

   @Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

   String result = data.getExtras().getString(“result”));//得到新Activity 关闭后返回的数据

    }

}    当新Activity关闭后,新Activity返回的数据通过Intent进行传递,android平台会调用前面Activity 的onActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。

使用startActivityForResult(Intentintent, int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent data)方法实现:

publicclass NewActivity extends Activity {

   @Override protected void onCreate(BundlesavedInstanceState) {

    button.setOnClickListener(newView.OnClickListener(){

      public void onClick(View v) {

      Intent intent = new Intent();//数据是使用Intent返回

    intent.putExtra(“result”,“传智播客的学生很可爱”);

//把返回数据存入Intent

         NewActivity.this.setResult(RESULT_OK,intent);//设置返回数据

         NewActivity.this.finish();//关闭Activity

      }});

   }

}

setResult()方法的第一个参数值可以根据业务需要自己定义,上面代码中使用到的RESULT_OK是系统Activity类定义的一个常量,值为-1,代码片断如下:

publicclass android.app.Activity extends ......{

  public static final int RESULT_CANCELED = 0;

  public static final int RESULT_OK = -1;

  public static final int RESULT_FIRST_USER =1;

}

9.请求码的作用

使用startActivityForResult(Intentintent, int requestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做:

  public void onCreate(BundlesavedInstanceState) {

         button1.setOnClickListener(newView.OnClickListener(){

         public void onClick(View v) {

        startActivityForResult (new Intent(MainActivity.this,NewActivity.class), 1);

      }});

        button2.setOnClickListener(newView.OnClickListener(){

    public void onClick(View v) {

        startActivityForResult (new Intent(MainActivity.this,NewActivity.class), 2);

      }});

       @Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

               switch(requestCode){

                   case 1:

                       //来自按钮1的请求,作相应业务处理

                   case 2:

                   //来自按钮2的请求,作相应业务处理

                }

          }

}

 

10.结果码的作用

在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):

publicclass ResultActivity extends Activity {

       ResultActivity.this.setResult(1,intent);

       ResultActivity.this.finish();

}

publicclass NewActivity extends Activity {

        NewActivity.this.setResult(2, intent);

        NewActivity.this.finish();

}

publicclass MainActivity extends Activity {

// 在该Activity会打开ResultActivity和NewActivity

      protected void onActivityResult(intrequestCode, int resultCode, Intent data) {

               switch(resultCode){

                   case 1:

                       // ResultActivity的返回数据

                   case 2:

                  // NewActivity的返回数据

                }

          }

}

 

 

你可能感兴趣的:(Android)