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

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);

}

接收结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: