Activity学习笔记

来源:互联网 发布:php.ini设置文件大小 编辑:程序博客网 时间:2024/06/05 03:03

Activity是Android四大组件之一,它是应用程序和用户交互的主要窗口。要想实现一个Activity非常简单,直接编写一个类来继承自Activity或者其子类,实现相应方法就可以了。
下面,我们在深入了解Activity之前,先看看Activity的生命周期图。

这里写图片描述
依据上图我们可以知道,首先是Activity被启动,Activity首次被创建就会调用oncreate()方法,进行一些数据的初始化,例如View的实例化,findViewById等,然后Activity调用onStart()方法,此时Activity处于可见状态。再接下来就是调用onResume()方法,此时Activity处于前台,用户可以和程序交互,比如触发事件。如果用户一些操作使得Activity变得不可见(比如跳转到其它Activity),那么就会调用onPause()方法,然后调用onStop()方法,这样Activty就不能在可见了,除非重新因为某些原因(如图,应用进程被杀死或者用户返回此Activity)才会重新回到可见状态。最后,如果调用finish()方法或者退出应用,Activity就会调用onDestroy()方法销毁Activity。

上面介绍了Activity的声明周期,那么,从Activity被创建到销毁之前,如果我们需要保存一些数据,应该怎么做呢?
下面我们再来看看一张图。
这里写图片描述
在onPause()或者onStop()阶段,我们需要做一些数据的保存,这样我们返回Activity的时候,之前的数据不会改变。

/*     * 用来保存Activity数据,由系统调用 outState 携带有Activity数据     *      * 这个方法不一定会在Activtiy销毁之前被系统调用,比如用户使用返回键显示关闭Activity.     * 所以在这个方法里面不宜做持久化数据操作(保存到数据库中),只是应该做一些保存瞬态数据(不是永久保存数据)的操作。     */    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        /**         * 使用键值对保存数据         */        Log.e(TAG, "onSaveInstanceState");    }

下面给出测试代码,就不截图了。

package com.example.first;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends ActionBarActivity {    private static final String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (savedInstanceState != null) {            // 不是第一次创建Activity            Log.e(TAG, "savedInstanceState不为null");        } else {            // 第一次创建Activity            Log.e(TAG, "savedInstanceState为null");        }    }    @Override    protected void onRestart() {        super.onRestart();        Log.e(TAG, "onRestart");    }    @Override    protected void onStart() {        super.onStart();        Log.e(TAG, "onStart");    }    @Override    protected void onResume() {        super.onResume();        Log.e(TAG, "onResume");    }    @Override    protected void onPause() {        super.onPause();        Log.e(TAG, "onPause");    }    @Override    protected void onStop() {        super.onStop();        Log.e(TAG, "onStop");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.e(TAG, "onDestroy");    }    /*     * 用来保存Activity数据,由系统调用 outState 携带有Activity数据     *      * 这个方法不一定会在Activtiy销毁之前被系统调用,比如用户使用返回键显示关闭Activity.     * 所以在这个方法里面不宜做持久化数据操作(保存到数据库中),只是应该做一些保存瞬态数据(不是永久保存数据)的操作。     */    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        /**         * 使用键值对保存数据         */        Log.e(TAG, "onSaveInstanceState");    }}

上面便是Activity的基本回调机制,那么Activity是如何被创建,又是如何描述Activity和保存Activity实例的呢?
其实,Activty是被应用启动器Laucher来启动或者被其它Activity,其它的组件来启动的。下面我们来看看使用Activity需要的配置文件。

 <activity            android:name="com.example.first.MainActivity"            android:label="@string/app_name"              android:launchMode="standard">           <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>

intent-filter里面的action和category的值就确定了这个Activity是被Laucher启动的。这里先不介绍intent-filter的用法。Activity还可以使用startActivity(Intent intent)或者startActivityForResult(Intent intent, int requestCode)这两个方法来启动。下面我们来介绍着两个方法的简单使用。

startActivity(Intent intent)的使用
先创建另外一个Activity类,命名为SecondActivity
一定记得要在mainfest.xml文件里面配置SecondActivity,不然报错

<!--描述一个Activity--> <activity            android:name=".SecondActivity"            android:label="@string/title_activity_second" >        </activity>

MianActivity.java

/** * 启动SecondActivity * @param view */    public void start(View view){        Intent intent=new Intent(MainActivity.this, SecondActivity.class);        startActivity(intent);//      finish();//销毁MainActivity    }

main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.first.MainActivity" >    <Button        android:text="start SecondActivity"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="start" /></RelativeLayout>

这样点击按钮就启动SecondActivity.

startActivityForResult(Intent intent, int requestCode)的使用
MainActivity.java

/**     * 启动SecondActivity      * @param view     */        public void startForResult(View view){            Intent intent=new Intent(MainActivity.this, SecondActivity.class);            // 0是请求码,标识该请求            startActivityForResult(intent, 0);//          finish();//销毁MainActivity        }        /**         * 重写该方法,用来获取该Activity指定跳转的Activity的返回结果         *          *    data被启动Activity(这里是SecondActivity)的intent         *    requestCode是启动其它Activity对应的请求码         *    resultCode是被启动的Activity返回时设置的结果码         *    requestCode+resultCode就可以唯一标识被启动Activity(这里是SecondActivity)返回来数据         */        @Override        protected void onActivityResult(int requestCode, int resultCode, Intent data) {            super.onActivityResult(requestCode, resultCode, data);            Log.e(TAG, "requestCode="+requestCode+" "+"resultCode="+resultCode);            Log.e(TAG, data.getStringExtra("SecondActivity"));//获取SecondActivity返回来的数据        }

SecondActivity.java

public void backSendResult(View view){        //获取启动该Activity的Activity的intent        Intent intent=getIntent();        intent.putExtra("SecondActivity", "你好MainActivity");        //设置结果码,返回上一Activity        setResult(SecondActivity_RESULT_CODE, intent);    }

要想理解Activity实例如何被保存的,我们需要先来看看Activity的启动模式。
Activity有四种启动模式,在mianfest.xml文件中使用android:launchMode="standard"来描述。四中启动模式分别是

//标准模式 standard  标准模式是Activity默认的启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。  //全局单例模式 singleInstance     在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。 //singleTop模式 Task顶模式  如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。//singleTask  Task内单例模式 如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。   

了解完了Activity的启动模式,下面我们来了解一些Activity和Activity之间的通信。
在上面例子中,我们可以看到Activity之间可以使用Intent的putXxx()方法和Intent getXxx()方法来传递数据。其实,常见的Activity传递数据的方法还包括Bundle。下面我们来看看怎么使用Bundle来传递数据。
SecondActivity.java

public void backSendResult(View view){        //获取启动该Activity的Activity的intent        Intent intent=getIntent();        //intent.putExtra("SecondActivity", "你好MainActivity");        Bundle bundle=new Bundle();        bundle.putString("SecondActivity", "你好MainActivity");        intent.putExtras(bundle);        //设置结果码,返回上一Activity        setResult(SecondActivity_RESULT_CODE, intent);    }

MainActivity.java

    @Override        protected void onActivityResult(int requestCode, int resultCode, Intent data) {            super.onActivityResult(requestCode, resultCode, data);            Log.e(TAG, "requestCode="+requestCode+" "+"resultCode="+resultCode);//          Log.e(TAG, data.getStringExtra("SecondActivity"));//获取SecondActivity返回来的数据            Log.e(TAG, data.getStringExtra("SecondActivity"));//获取SecondActivity返回来的数据        }

Activity的基本知识介绍到这。

0 0
原创粉丝点击