您的位置:首页 > 移动开发 > Android开发

Activity学习笔记

2016-09-01 00:26 274 查看
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的基本知识介绍到这。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android