Android四大组件之Activity

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);
}
接收结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值