Activity学习笔记

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值