Android 四大组件(一)Activity

之前一直是在CSDN上写的blog,感觉csdn经常会出现一下bug,所以就开始向简书上转移。
之前csdn的博客地址
Android四大组件:Activity、Service服务、Content Provider内容提供者、BroadcastReceiver广播接收器。Activity翻译为“活动”,在android应用中,一个Activity通常就是一个单独的屏幕,用来与用户进行交互。它是Android应用中最常见、最常用的组件。


1 建立和配置Activity

建立自己的Activity需要继承Activity类,也可以根据情况继承Activity的子类。如下:FirstActivity.java

package com.vn.hello;  
  
import android.app.Activity;  
import android.os.Bundle;  
  
public class FirstActivity extends Activity{  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
    }  
}

除此之外还需要布局文件activity_main.xml文件用来显示Activity界面,其代码如下:

<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.vn.hello.FirstActivity" >  
    <Button  
        android:id="@+id/button1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerHorizontal="true"  
        android:layout_centerVertical="true"  
        android:text="@string/first" />  
</RelativeLayout>  

布局文件可以通过修改RelativeLayout来调整页面布局方式。可以再上述文件中间添加所需控件如:button、textview、editview等。
还有就是需要在清单文件AndroidManifest.xml文件里配置需要显示的Activity。

<activity  
    android:name=".FirstActivity"  
    android:label="@string/app_name" >  
    <intent-filter>  
        <action android:name="android.intent.action.MAIN" />  
  
        <category android:name="android.intent.category.LAUNCHER" />  
    </intent-filter>  
</activity>

将此元素添加到<application> </application>中间。上面代码中的
name表示该Activity的实现类;
label表示该Activity的标签。
<intent-filter....../>可以有一个或多个,用于指定该Activity可以响应的Intent。配置完这些运行安装到手机就可以显示出这个Activity了。


2 Activity的生命周期

先看一下Activity的生命周期图:

20151015142603481.jpeg

这个是Activity的流程,

  1. 启动Activity:系统会先调用onCreate方法,然后调用onStart方法,然后调用onResume,Activity进入运行状态。
  2. 用户销毁当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
  3. 当前Activity由被覆盖状态回到前台或解锁屏或对话框消失:系统会调用onResume方法,再次进入运行状态。
  4. 当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态,此时不可见。
  5. 用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
  6. 当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
  7. 当前Activity被其他Activity覆盖其上或被锁屏或被对话框覆盖:系统会调用onPause方法,暂停当前Activity的执行。

3 Activity跳转

看一下这个例子两个Activity的跳转:
FirstActivity.java

package com.vn.test;  
  
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.widget.Button;  
  
public class FirstActivity extends Activity {  
    private String TAG = "FirstActivity";  
    private Button mButton;  
  
    //Activity创建时调用  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_first);  
        Log.i(TAG, "First--onCreate");  
        mButton=(Button) findViewById(R.id.button1);  
        mButton.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                startActivity(new Intent(FirstActivity.this,SecondActivity.class));  
            }  
        });  
    }  
    //Activity创建、从后台重新回到前台时被调用  
    @Override  
    protected void onStart() {  
        super.onStart();  
        Log.i(TAG ,"First--onStart");  
    }  
    //Activity从后台回到前台  
    @Override  
    protected void onRestart() {  
        super.onRestart();  
        Log.i(TAG ,"First--onRestart");  
    }  
    //Activity从创建、被覆盖到显示、从后台回到前台  
    @Override  
    protected void onResume() {  
        super.onResume();  
        Log.i(TAG ,"First--onResume");  
    }  
    //获取或失去焦点  
    @Override  
    public void onWindowFocusChanged(boolean hasFocus) {  
        super.onWindowFocusChanged(hasFocus);  
        Log.i(TAG ,"First--onWindowFocusChanged "+hasFocus);  
    }  
  
    @Override  
    protected void onPause() {  
        super.onPause();  
        Log.i(TAG ,"First--onPause");  
    }  
  
    @Override  
    protected void onStop() {  
        super.onStop();  
        Log.i(TAG ,"First--onStop");  
    }  
  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        Log.i(TAG ,"First--onDestroy");  
    }  
  
    @Override  
    protected void onSaveInstanceState(Bundle outState) {  
        super.onSaveInstanceState(outState);  
    }  
  
    @Override  
    protected void onRestoreInstanceState(Bundle savedInstanceState) {  
        super.onRestoreInstanceState(savedInstanceState);  
    }  
}

第二个Activity SecondActivity.java

package com.vn.test;  
  
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
  
public class SecondActivity extends Activity {  
    private String TAG = "SecondActivity";  
    private Button jump;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.second);  
        Log.i(TAG ,"Second--onCreate");  
        jump=(Button) findViewById(R.id.button1);  
        jump.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                startActivity(new Intent(SecondActivity.this,FirstActivity.class));  
            }  
        });  
    }  
    @Override  
    protected void onStart() {  
        super.onStart();  
        Log.i(TAG ,"Second-onStart");  
    }  
    //Activity从后台回到前台  
    @Override  
    protected void onRestart() {  
        super.onRestart();  
        Log.i(TAG ,"Second--onRestart");  
    }  
    @Override  
    protected void onResume() {  
        super.onResume();  
        Log.i(TAG ,"Second--onResume");  
    }  
    @Override  
    public void onWindowFocusChanged(boolean hasFocus) {  
        super.onWindowFocusChanged(hasFocus);  
        Log.i(TAG ,"Second--onWindowFocusChanged "+hasFocus);  
    }  
    @Override  
    protected void onPause() {  
        super.onPause();  
        Log.i(TAG ,"Second--onPause");  
    }  
    @Override  
    protected void onStop() {  
        super.onStop();  
        Log.i(TAG ,"Second--onStop");  
    }  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        Log.i(TAG ,"Second--onDestroy");  
    }  
}

当应用程序开启时输出log:

First--onCreate  
First--onStart  
First--onResume  
First--onWindowFocusChanged true

当点击FirstActivity的按钮会跳转到SecondActivity,调用方法顺序(可能会因为Andorid版本的改动而有所变动):

First--onPause  
Second--onCreate  
Second-onStart  
Second--onResume  
First--onWindowFocusChanged false  
Second--onWindowFocusChanged true  
First--onStop

onWindowFocusChanged方法在Activity窗口获得或失去焦点时被调用。不一定在第二个界面显示出来才调用,我试了两个手机,结果不一样。版本低的是上述的情况,另一个版本较高的手机顺序是:

First--onPause  
First--onWindowFocusChanged false  
Second--onCreate  
Second--onStart  
Second--onResume  
Second--onWindowFocusChanged true  
First--onStop 

从新回到FirstActivity,调用方法顺序:

Second--onPause  
Second--onWindowFocusChanged false  
First--onRestart  
First--onStart  
First--onResume  
First--onWindowFocusChanged true  
Second--onStop

当锁屏或屏幕休眠时,依次调用方法:

First--onPause  
First--onStop

重新解锁:

First--onRestart  
First--onStart  
First--onResume

并没有调用onWindowFocusChanged方法。

而当按home键时,回到手机主页面,依次调用方法如下,屏幕失去焦点。

First--onPause  
First--onWindowFocusChanged false  
First--onStop

重新进入程序打开FirstActivity,获取焦点。调用方法:

First--onRestart  
First--onStart  
First--onResume  
First--onWindowFocusChanged true

当第一个界面弹出一个对话框(没有全部覆盖FirstActivity),或者SecondActivity是对话框形式的。方法如下:

First--onPause  
First--onWindowFocusChanged false  
Second--onCreate  
Second-onStart  
Second--onResume  
Second--onWindowFocusChanged true  
//第一个界面并没有调用onStop方法。只有全部覆盖才会调用onStop方法。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容