博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 四大组件(一)Activity
阅读量:499 次
发布时间:2019-03-07

本文共 6568 字,大约阅读时间需要 21 分钟。

Activity是Android四大组件之一,其他三个是(Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)。Activity翻译为“活动”,在android应用中,一个Activity通常就是一个单独的屏幕,用来与用户进行交互。它是Android应用中最常见、最常用的组件。

(一)建立和配置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来调整页面布局方式。可以再上述文件中间添加所需控件如:button、textview、editview等。

还有就是需要在清单文件AndroidManifest.xml文件里配置需要显示的Activity。

将此元素添加到<application> </application>中间。上面代码中的

name表示该Activity的实现类;

label表示该Activity的标签。

<intent-filter....../>可以有一个或多个,用于指定该Activity可以响应的Intent。配置完这些运行安装到手机就可以显示出这个Activity了。

(二)Activity的生命周期

这个是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的执行。

看一下这个例子两个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);    }}
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--onCreateFirst--onStartFirst--onResumeFirst--onWindowFocusChanged true

当点击FirstActivity的按钮会跳转到SecondActivity,调用方法顺序:

First--onPauseSecond--onCreateSecond-onStartSecond--onResumeFirst--onWindowFocusChanged falseSecond--onWindowFocusChanged trueFirst--onStop

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

First--onPauseFirst--onWindowFocusChanged falseSecond--onCreateSecond--onStartSecond--onResumeSecond--onWindowFocusChanged trueFirst--onStop

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

Second--onPauseSecond--onWindowFocusChanged falseFirst--onRestartFirst--onStartFirst--onResumeFirst--onWindowFocusChanged trueSecond--onStop
当锁屏或屏幕休眠时,依次调用方法:

First--onPauseFirst--onStop
重新解锁:

First--onRestartFirst--onStartFirst--onResume
并没有调用onWindowFocusChanged方法。

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

First--onPauseFirst--onWindowFocusChanged falseFirst--onStop
重新进入程序打开FirstActivity,获取焦点。调用方法:

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

First--onPauseFirst--onWindowFocusChanged falseSecond--onCreateSecond-onStartSecond--onResumeSecond--onWindowFocusChanged true//第一个界面并没有调用onStop方法。只有全部覆盖才会调用onStop方法。

你可能感兴趣的文章