• 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()可以在活动被系统强制清理时保存状态并在用户回到活动时候调用,所以可以用于保存一些临时状态,并在返回时候恢复这些状态;
     
      
     
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/coldforce/p/4973208.html
Copyright © 2020-2023  润新知