zoukankan      html  css  js  c++  java
  • Activity活动

      其实之前自己已经学习过,但是有些东西多少也忘记了,还是得再重新复习一下,再去找资料和网上搜索来加深自己的记忆;

      Activity的一些基本信息

      Activity通常是单独的屏幕,显示控件,用于用户操作,并对用户的操作事件进行响应处理;
      Actvity之间通过Intent进行通信;Intent中,对于动作以及动作的数据是比较关键的,当然,我们也可以直接指定要启动的Activity;
      Intent intent = new Intent();
      intent.setClass(this, SomeOtherActivity.class);
      startActivity(intent);
     
      每个Activity,都需要在 AndroidManifest.xml中进行描述,否则无法启动;
      例如工程默认启动的Activity
     
      <activity
          android:name=".MainActivity"
          android:alwaysRetainTaskState="true"
          android:label="@string/app_name"
          android:uiOptions="splitActionBarWhenNarrow" >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
     
      需要指定名称为对应的Activity类名;由于是启动的Actvity,所以需要指定action为Main,category为LAUNCHER,这样才能在启动的时候经过 intent-filter的过滤,找到这个activity来启动; 
      其他的activity也需要进行描述;
     
      <activity
          android:name=".ContactDetailActivity"
          android:label="@string/title_activity_contact_detail" >
          <!-- android:theme="@android:style/Theme.Black" -->
      </activity>
     
      当然,如果我们需要让我们的activity来处理其他action时候,我们就需要指定 action,同时接收的时候,处理action对应的数据;
      这个时候,我们需要从调用 startActivity的地方,准备好要传给对应activity的数据;
      简单的传递数据
     
      intent.putExtra("key","value");
     
      在接受的activity中;
     
      Intent intent = this.getIntent();
      String flagValue = intent.getStringExtra("flag");
     
      我们也可以通过Intent.getExtras();返回一个Bundle对象,可以从这个对象里获取对应的值;
      例如我们通过 startActivityForResult方式启动另外一个Activity,然后得到那个Activity返回的数据,例如我们需要打开一个Activity来收集用户信息,用户点击提交的时候,我们需要得到用户数据,这个时候
     
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            switch (resultCode)
            {
                //结果返回
            case RESULT_OK:
                //获取Bundle的数据
                Bundle bl= data.getExtras();
                String sex=bl.getString("sex");
                if (sex.equals("M"))
                {
                    rbMan.setChecked(true);
                }
                else
                {
                    rbWoman.setChecked(true);
                }
                body_height=bl.getDouble("height");
                editHight.setText(""+body_height);
                break;
            default:
                break;
            }
        }
     
      通过Intent.getExtras获得Bundle之后,再去取里面的数据,其实和直接从Intent获取数据类似;
      我们启动的时候,需要通过startActivityForResult来启动:
     
      //通过intent跳转到下一个页面.
      Intent intent = new Intent();
      intent.setClass(ActivityBundle.this, ResultActivity.class);
     
      //跳到下一个Activity,并且等待其返回结果
      startActivityForResult(intent, 0);
     
     
      此时,另外一个Activity在收集完数据返回的地方,需要设置结果:
     
      //将intent传会上一个Activity
      Intent intent = new Intent();
      //通过Bundle来获取数据,通过key-Value的方式放入数据
      Bundle bl = new Bundle();
      bl.putDouble("height", body_height);
      bl.putString("sex", sex);
      //将Bundle放入Intent传入下一个Activity
      intent.putExtras(bl);
      ResultActivity.this.setResult(RESULT_OK, intent);
      ResultActivity.this.finish();
     
      有的时候,我们的基础数据类型,可能传递不了特定类型的数据(最大只能40K),或者数据太大(例如文件什么的),不方便直接通过intent的Bundle传递的时候,我们可以传递一个uri给到另外的Activity进行处理;
     
      例如我们打开网页的时候;
      Uri uri = Uri.parse(“http://www.cnblogs.com/”);
      Intent intent = new Intent(Intent.ACTION_VIEW, uri);
      startActivity(intent);
     
      依此类推,我们还有其他的常用ACTION
      Intent.ACTION_DIAL 打开拨号界面
      Intent.ACTION_CALL 直接拨打电话
      Intent.ACTION_DELETE  卸载应用
      Intent.ACTION_SENDTO  打开邮件发送界面
      Intent.ACTION_SEND    直接发送邮件
      。。。
     
      当然这种方式只是特定的action以及action对应数据uri的一种方式;
      我们也可以bundle来传递uri的字符串表示,然后在处理的activity使用
      Uri uri = Uri.parse(intent.getStringExtra("uri"));
     
      这样的方式来传递;
      还有可以使用 Intent.EXTRA_STREAM 来传递uri ;
      intent.putExtra(Intent.EXTRA_STREAM, uri);
     

      关于Activity的生命周期

      

      这个图片也是最基本的Activity生命周期的状态图;

      

      Activity有三种状态:
      1、运行,即用户正在操作或者该活动在最顶部;
      2、暂停,有别的活动在上方,但是对于用户仍然可见;
      3、停止,活动被完全覆盖,不可见;
     
      三种状态中,后两种状态在系统需要内存的时候会被清理;用户回到该活动时候需要重新onCreate;
      活动完整生命周期和可视生命周期分别为onCreate到onDestroy和onStart到onStop;前台生命周期为onResume到onPause;
      根据我们的需要,重载这些函数来定制我们需要的处理流程;
        

      一般来说,我们对于完整生命周期需要的,初始化和摧毁放着完整生命周期两个函数,对于与界面相关的,放在可视生命周期函数,而前台生命周期的处理要轻量级;

      onPause是三个结束周期函数中,唯一一个必然调用的,所以一些持久化之类的需要在里面处理;
      onSaveInstanceState()和onRestoreInstanceState()可以在活动被系统强制清理时保存状态并在用户回到活动时候调用,所以可以用于保存一些临时状态,并在返回时候恢复这些状态;
     
      
     
  • 相关阅读:
    HTML5 新增元素梳理
    HTML布局梳理
    ES6中新增let命令使用方法
    xml学习-语法规则
    初步了解URL
    JavaScript——装饰者模式
    移动视频技术——新增API可手工修正视频方向
    如何在移动视频开发中使用ip组播技术
    Windows平台AnyChat视频显示
    如何实现音频合成立体声录制?
  • 原文地址:https://www.cnblogs.com/coldforce/p/4973208.html
Copyright © 2011-2022 走看看