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); } }</span>除此之外还需要布局文件activity_main.xml文件用来显示Activity界面,其格式为:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><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了。
(二)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--onCreate First--onStart First--onResume First--onWindowFocusChanged true
当点击FirstActivity的按钮会跳转到SecondActivity,调用方法顺序:
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方法。