之前一直是在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来调整页面布局方式。可以再上述文件中间添加所需控件如:button、textview、editview等。
还有就是需要在清单文件AndroidManifest.xml文件里配置需要显示的Activity。
将此元素添加到
name表示该Activity的实现类;
label表示该Activity的标签。
2 Activity的生命周期
先看一下Activity的生命周期图:
这个是Activity的流程,
- 启动Activity:系统会先调用onCreate方法,然后调用onStart方法,然后调用onResume,Activity进入运行状态。
- 用户销毁当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
- 当前Activity由被覆盖状态回到前台或解锁屏或对话框消失:系统会调用onResume方法,再次进入运行状态。
- 当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态,此时不可见。
- 用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
- 当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
- 当前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方法。