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的返回数据

                }

          }

}

 

 

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android(安卓)通用获取Ip的方法(判断手机是否联网的方法)!!!
  4. Content Provider使用方法以及Android运行时权限申请
  5. Android布局和intent实例
  6. Webkit for Android分析
  7. GIS的学习(二十四)android异步调用geoserver wms中的地图
  8. Android(安卓)腾讯面试Glide源码解析 3分钟手写最牛框架 看完成
  9. 数据备份

随机推荐

  1. 如何正常关闭android应用程序
  2. android手机端与PC端使用adb forword通信
  3. android dex工具打包Could not reserve e
  4. android 从Activity 获取 rootView 根节
  5. android:SQlite
  6. android修改当前窗口的亮度
  7. 使用Maven开发Android
  8. android ScrollView嵌套ListView,并且实现
  9. Android运行时权限策略和easyPermission
  10. Android中级教程之(二)----->Android(安卓)