Android初级之路---------探究Activity

来源:互联网 发布:观察者模式例子java 编辑:程序博客网 时间:2024/05/01 11:17

<span style="font-size:24px;"> 1 ---------Activity是什么?            </span>
<span style="font-size:24px;">              它是一种可以包含用户界面的组件,主要是负责和用户交互的,它是Android应用程序的门面,凡是你在应用中看见的东西都是放在Activity中的。</span>
<span style="font-size:24px;"> 2 ------- 在Activity中使用Toast-------显示提示信息框      </span>
<span style="font-size:24px;">               Toast是Android系统提供的,它具有以下2个特点                          </span>
<span style="font-size:24px;">                            a---Toast提示信息不会获得焦点                         </span>
<span style="font-size:24px;">                            b---Toast提示信息过一段时间会自动消失             ]</span>
<span style="font-size:24px;">                Toast生成消息的步骤                           </span>
<span style="font-size:24px;">                           a---调用Toast的构造器或调用makeText()静态方法创建一个Toast对象</span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">                                       b---调用Toast的方法来设置消息提示框的对齐方式,页边距等                      </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">                                        c---调用Toast的show()方法显示出来             </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">         Toast的方法                          </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">                 a---setGravity(int,int x,int y)设置消息出现在屏幕中位置,参数分别代表   Gravity, x方向的偏移,Y方向的偏移                    </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">                 b---setView(view v)设置Toast显示自定义View                         </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">                 C---setDuration()设置显示时间        </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">Toast总结:Toast功能比较简单,大部分它只可以显示简单的文本提示,如果应用需要显示诸如图片,列表之类复杂的提示,就需要用Toast的构造器来创建对象,再条用setView(view v)方法来设置Toast显示的View组件,该方法允许开发者自己定义View      </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;"> 3 ------------------- 销毁一个Activity"          </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">  Activity类提供了一个finish()方法,我们在活动中调用一下这个方法就可以销毁当前活动</span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">  4--------------------- 使用Intent在活动Activity之间穿梭        </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">                a---  一个Intent中只可以指定一个action,但却可以指定多个category           </span>
<span style="font-family: Arial, Helvetica, sans-serif;font-size:24px;">               b--- 隐式启动一定要配置    </span><pre style="font-family: 宋体; font-size: 15.8pt; background-color: rgb(255, 255, 255);">    <<span style="color:#000080;"><strong>category </strong></span><span style="color:#660e7a;"><strong>android</strong></span><span style="color:#0000ff;"><strong>:name=</strong></span><span style="color:#008000;"><strong>"android.intent.category.LAUNCHER" </strong></span>/>
        C---向下一个活动传递数据----Intent
            Intent调用putExtra()把我们想传递的数据暂时放在Intent中,启动另外一个活动的时候,只需要从Intent中取出来:
            首先通过getIntent()方法获得用于启动这个活动的Intent,再调用get..()对应的方法取得数据。
        D---返回数据给上一个活动
            Activity有一个StartActivityForResult()方法,这个方法期望在活动销毁的时候可以返回一个结果给上一个活动。其中有2个参数:第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
           如:当前Activity
      Intent intent =new Intent("android.intent.action.xxx");      intent.putExtra("chuan","你好");      startActivityForResult(intent,1);
           启动的Activity的代码
      Intent intent=new Intent();//构建一个Intent      intent.putExtra("shuju-return","你好上一个活动");      setResult(RESULT_OK,intent);//这个方法是专门用于向上一个活动返回数据的,有2个参数,第一个参数一般使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数就是把带有数据的Intent传递回去。
      finish();调用finish()销毁Activity
             由于我们使用startActivityForResult()来启动Activity,当这个Activity销毁的之后会回调上一个活动的onActivityResult()
  
 @Override   protected void onActivityResult(int requestCode, int resultCode, Intent data) {    switch (requestCode){     case 1:         if (resultCode==RESULT_OK){             String ss=data.getStringExtra("shuju-return");             Log.d("nihao",ss);         }} }           

onActivityResult中的三个参数,第一参数requestCode就是我们在启动活动时候的请求码
                             第二参数resultCode就是我们返回数据传入的处理结果
第三个参数data就是返回数据Intent
当用户按下Back键,就会去调用onBackPress()方法的代码

5 -------------Activity的生命周期

      1 首先的明白几件事情:Android中的Activity活动是可以层叠的

                                       我们每启动一个新的活动,机会覆盖在原活动之上

                                       点击Back键就会销毁最上面的活动,下面的活动就会显示来

       2 Android中是有栈的形式来管理活动的:栈是一种后进先出的数据结构,这个栈也当称作返回栈。     

       3 Activity活动的4中状态:

                                        运行状态:当一个活动处于在返回栈的栈顶时,此时的活动就处于运行状态,此时用户可见,可以获得焦点,系统最不愿意回收就是处于运行状态的活动,因为这会带来非常差的用户体验。


                                        暂停状态:其他活动处于栈顶,但是这个活动依然可见,只是不可以获得焦点 


                                         停止状态:当一个活动不处于栈顶,且完全不可见的时候,就是停止状态

                                         销毁状态:当一个活动从返回栈移除后就变成销毁状态

       4活动生存期:Activity中定义了7个回调方法

                                          onCreat():第一次创建Activity时被回调,该方法只被调用一次。

                                          onStart()这个方法在活动由不可见变为可见的时候调用

                                          onResume()这个方法在活动准备好和用户交互的时候被调用。此时的活动一定位于返回栈的栈顶,处于运行状态,在 onStart()之后一定会调用这个方法。                            onpause()暂停的时候被回调

                                          onStop()活动停止的时候被回调

                                          onDestor()销毁的时候被调用

                                          onRestart()活动有停止状态变为运行状态之前调用。


      总结---------销毁活动会回调----onPause()   onStop  onDestor()

                 活动停止被回调的----onPause()   onStop()

      思考问题-----------Activity活动被回收了怎么办?

                  有一个活动A处于停止状态的时候,这个时候由于手机内存不足,将活动A回收掉了,当我们按返回键返回A活动时会出现什么情况?

                   答:还是会正常显示A活动,但是不会调用onRestart()方法,会调用onCreat()方法,因为这种情况下活动A会被重新创建一次,这样看上去好像一切正常,但是别忘记一个重要问题,活动A可能存在的临时数据和状态会被丢失,因为活动Activity被重新创建了。如果出现这种情况,是会严重影响用户体验的。      

                    解决方案:Activity中提供一个onSaveInstanceState(Bundle bundle)方法

    这个方法一定会在活动被销毁之前被调用,如下:

<span style="font-size:18px;">  @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        outState.putString("baocun","百度一下伟大的李清");//数据同过键值对的    }                                                        形式保存</span>
   问题又来了,你保存了数据,那在哪里进行恢复?细心的你也许早就发现我们一直使用onCreat()中其实也有一个Bundle类型的参数,这个参数在一般情况下都是null,但是当活动在被系统回收之前有通过onSaveInstanceState(Bundle outState)方法来保存数据的话,那么这个参数就会带有之前所保存的所有的数据,我们只需要把数据取出来就可以了。
<span style="font-size:18px;">  @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_log_cat);        Log.d("nihao", "第一行代码");        if(savedInstanceState==null){            Log.d("nihao", "活动没有被销毁");        }        if(savedInstanceState!=null){            String ss=savedInstanceState.getString("baocun");            Log.d("nihao", ss);        }    }</span>

6---------活动的启动模式:一共有4中    standard  singleTop, singleTask      singleInstance                                             

     可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式                                

          standard :活动的默认启动模式,在不进行显示指定的情况下,所有活动所有活动都会使用这种启动模式,我们知道每到启动一个活动,它的实例就会在返回栈中入栈,并处于栈顶。对于standard模式的活动,系统不会在乎这个活动是否在返回栈中存在,每次启动都会重新创建该活动的一个新的实例并在返回栈中入栈。

         singleTop:在启动活动时发现返回栈的栈顶已经是该活动了,则认为可以直接使用它,不会在在创建活动的实例。

         singleTask:每次启动该活动时候,系统首先会在返回栈中检查是否存在该活动的实例,如果发现存在,则直接使用该实例,并把该活动实例之上的所有活动统统出栈,如果没有就会创建一个实例,这种启动模式保证了返回栈只存在一个该活动的实例。

         singleInstance:这个模式下会有单独的一个返回栈来管理这种模式启动的活动,不管那个应用程序访问这个活动,都会共用同一个栈,也就解决共享活动的问题。

                                         




0 0
原创粉丝点击