Android四大组件之Activity
2016-01-05 22:34
651 查看
Android四大组件之Activity
Android四大组件有Activity、Service、Content Provider、Broadcast Receiver一、Activity
1.1 Activity可以视作为一个单独的活动窗口
1.2 Activity可以通过Intent来通讯
1.3 Activity需要在AndroidMinifest.xml配置中声明才能生效,不然将会找不到Acitivity
1.4 Activity有自己的生命周期
Activity的生命周期
从上图可以简单看出正常情况下Activity的生命周期。
下面写一个例子来验证一下:
创建只有一个MainActivity的工程
package com.example.testactivity; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; public class MainActivity extends ActionBarActivity { public static final String TAG = MainActivity.class.getSimpleName(); private void log(String msg) { Log.v(TAG, msg); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); log("onCreate"); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); log("onStart"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); log("onPause"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); log("onResume"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); log("onStop"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); log("onRestart"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); log("onDestory"); } }
从log可以看到以下情况
1、启动项目的时候,即启动MainActivity的时候
onCreate->onStart->onResume
01-05 21:30:37.310: V/MainActivity(3742): onCreate 01-05 21:30:37.310: V/MainActivity(3742): onStart 01-05 21:30:37.310: V/MainActivity(3742): onResume
2、按Home键返回到桌面,即切换到后台状态
onPause->onStop
01-05 21:41:19.000: V/MainActivity(4474): onPause 01-05 21:41:19.850: V/MainActivity(4474): onStop
3、返回到MainActivity
onRestart->onStart->onResume
01-05 21:43:37.750: V/MainActivity(4474): onRestart 01-05 21:43:37.750: V/MainActivity(4474): onStart 01-05 21:43:37.750: V/MainActivity(4474): onResume
4、在当前Activity显示为MainActivity的时候按返回键
onPause->onStop->onDestory
01-05 21:44:10.460: V/MainActivity(4474): onPause 01-05 21:44:11.350: V/MainActivity(4474): onStop 01-05 21:44:11.350: V/MainActivity(4474): onDestory
比较重要的回调:
onCreate:一般做一些初始化的操作
onStart:
onResume:是Activity到前台的操作,一般看看是否需要刷新
onPause:这里一般可以在暂停的时候保存一些数据
onStop:这里acitivity已经后台了(也就是说压入栈了)
onDestroy:销毁时候的回调,一般做一些关闭操作。
因为android系统资源管理的原因,onPause,onstop, onDestroy,三种状态下 activity都有可能被系统kill 掉。
Activity间的通信
Activity之间通过Intent来进行通信。
例如Activity跳转时候传入的Intent对象。
public class MainActivity extends ActionBarActivity { public static final String TAG = MainActivity.class.getSimpleName(); private void log(String msg) { Log.v(TAG, msg); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); log("onCreate"); startActivity(new Intent(this, Activity2.class)); } }
其实不单单是Activity交互用Intent,还有其它组件也会用到。
Activity中有个Intent-Filter的东西,如起名字,是过滤器。有赋值的时候,Activity Manager将通过这个属性来进行匹配。
如MainActivity中在AndroidManifest.xml的配置
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
上面的配置说明MainActivity的程序的入口Activity,
action为MAIN决定最先启动的Activity
category的LAUNCH决定是否显示在程序列表中
所以程序启动的时候,先运行的将是MainActivity。
多个Activity的管理是通过栈管理
当前显示的Activity在栈顶,当有新的Activity进入的时候,旧Activity不销毁的情况下,将压入栈。常见的情况如Activity1跳转到Activiy2,然后按返回键,将会回到Activity1,如果在Activity1跳到Activiy2,Activity1调用的finish()方法,在Activity2按返回键的时候,将直接退出程序。
Activity的加载模式
standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为standard
standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。
singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例
singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
singleInstance:首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效。
Activity的跳转
Activity跳转
startActivity(Intent intent);
有返回值的跳转
startActivityForResult(Intent intent, int requestCode);
然后在目的Acitivity中调用finish()前设置返回值,接口是setResult(int resultCode, Intent data);
然后在Activity中的
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
// TODO Auto-generated method stub
super.onActivityResult(arg0, arg1, arg2);
}
接收结果
相关文章推荐
- 【Android】自定义View
- Android 设计模式 之 单例模式
- Android 开发知识收藏夹(2)
- 最棒的开源 Android 应用:聊天、图像、音频等等
- Android动态修改view的长和宽
- Android开发中小知识
- 创建Material Design风格的Android应用--应用主题
- Android屏幕适配全攻略(最权威的官方适配指导)
- 专访罗升阳:老罗的Android之旅
- Android之不需要自定义View(ViewfindView.java)最简单的二维码扫描
- 闲话Android游戏开篇
- Android透明度的三种表示方式
- android图片显示的几种办法
- Androidstudio加速编译
- Android中往手机自带的存储空间写入文件
- Android之图片工具类ImageUtil
- android 打包失败
- FloatingActionButton
- android悬浮按钮(Floating action button)的两种实现方法
- android调用WebService接口