Activity学习笔记
2016-09-01 00:26
281 查看
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的基本回调机制,那么Activity是如何被创建,又是如何描述Activity和保存Activity实例的呢?
其实,Activty是被应用启动器Laucher来启动或者被其它Activity,其它的组件来启动的。下面我们来看看使用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,不然报错
MianActivity.java
main_activity.xml
这样点击按钮就启动SecondActivity.
startActivityForResult(Intent intent, int requestCode)的使用
MainActivity.java
SecondActivity.java
要想理解Activity实例如何被保存的,我们需要先来看看Activity的启动模式。
Activity有四种启动模式,在mianfest.xml文件中使用
了解完了Activity的启动模式,下面我们来了解一些Activity和Activity之间的通信。
在上面例子中,我们可以看到Activity之间可以使用Intent的putXxx()方法和Intent getXxx()方法来传递数据。其实,常见的Activity传递数据的方法还包括Bundle。下面我们来看看怎么使用Bundle来传递数据。
SecondActivity.java
MainActivity.java
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的基本知识介绍到这。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories