Android 四大组件(一)Activity

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

转载https://blog.csdn.net/vnanyesheshou/article/details/49126315

(一)建立和配置Activity

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

[java]  view plain  copy
  1. package com.vn.hello;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class FirstActivity extends Activity{  
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_main);  
  11.     }  
  12. }</span>  
除此之外还需要布局文件activity_main.xml文件用来显示Activity界面,其格式为:
[html]  view plain  copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context="com.vn.hello.FirstActivity" >  
  10.     <Button  
  11.         android:id="@+id/button1"  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content"  
  14.         android:layout_centerHorizontal="true"  
  15.         android:layout_centerVertical="true"  
  16.         android:text="@string/first" />  
  17. </RelativeLayout>  

布局文件可以通过修改RelativeLayout来调整页面布局方式。可以再上述文件中间添加所需控件如:button、textview、editview等。

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

[html]  view plain  copy
  1. <activity  
  2.     android:name=".FirstActivity"  
  3.     android:label="@string/app_name" >  
  4.     <intent-filter>  
  5.         <action android:name="android.intent.action.MAIN" />  
  6.   
  7.         <category android:name="android.intent.category.LAUNCHER" />  
  8.     </intent-filter>  
  9. </activity>  
将此元素添加到<application> </application>中间。上面代码中的

name表示该Activity的实现类;

label表示该Activity的标签。

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

扫描二维码关注公众号,回复: 1695654 查看本文章

这个是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

[java]  view plain  copy
  1. package com.vn.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9.   
  10. public class FirstActivity extends Activity {  
  11.     private String TAG = "FirstActivity";  
  12.     private Button mButton;  
  13.   
  14.     //Activity创建时调用  
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_first);  
  19.         Log.i(TAG, "First--onCreate");  
  20.         mButton=(Button) findViewById(R.id.button1);  
  21.         mButton.setOnClickListener(new View.OnClickListener() {  
  22.             @Override  
  23.             public void onClick(View v) {  
  24.                 startActivity(new Intent(FirstActivity.this,SecondActivity.class));  
  25.             }  
  26.         });  
  27.     }  
  28.     //Activity创建、从后台重新回到前台时被调用  
  29.     @Override  
  30.     protected void onStart() {  
  31.         super.onStart();  
  32.         Log.i(TAG ,"First--onStart");  
  33.     }  
  34.     //Activity从后台回到前台  
  35.     @Override  
  36.     protected void onRestart() {  
  37.         super.onRestart();  
  38.         Log.i(TAG ,"First--onRestart");  
  39.     }  
  40.     //Activity从创建、被覆盖到显示、从后台回到前台  
  41.     @Override  
  42.     protected void onResume() {  
  43.         super.onResume();  
  44.         Log.i(TAG ,"First--onResume");  
  45.     }  
  46.     //获取或失去焦点  
  47.     @Override  
  48.     public void onWindowFocusChanged(boolean hasFocus) {  
  49.         super.onWindowFocusChanged(hasFocus);  
  50.         Log.i(TAG ,"First--onWindowFocusChanged "+hasFocus);  
  51.     }  
  52.   
  53.     @Override  
  54.     protected void onPause() {  
  55.         super.onPause();  
  56.         Log.i(TAG ,"First--onPause");  
  57.     }  
  58.   
  59.     @Override  
  60.     protected void onStop() {  
  61.         super.onStop();  
  62.         Log.i(TAG ,"First--onStop");  
  63.     }  
  64.   
  65.     @Override  
  66.     protected void onDestroy() {  
  67.         super.onDestroy();  
  68.         Log.i(TAG ,"First--onDestroy");  
  69.     }  
  70.   
  71.     @Override  
  72.     protected void onSaveInstanceState(Bundle outState) {  
  73.         super.onSaveInstanceState(outState);  
  74.     }  
  75.   
  76.     @Override  
  77.     protected void onRestoreInstanceState(Bundle savedInstanceState) {  
  78.         super.onRestoreInstanceState(savedInstanceState);  
  79.     }  
  80. }  
SecondActivity.java

[java]  view plain  copy
  1. package com.vn.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10.   
  11. public class SecondActivity extends Activity {  
  12.     private String TAG = "SecondActivity";  
  13.     private Button jump;  
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.second);  
  18.         Log.i(TAG ,"Second--onCreate");  
  19.         jump=(Button) findViewById(R.id.button1);  
  20.         jump.setOnClickListener(new OnClickListener() {  
  21.             @Override  
  22.             public void onClick(View v) {  
  23.                 startActivity(new Intent(SecondActivity.this,FirstActivity.class));  
  24.             }  
  25.         });  
  26.     }  
  27.     @Override  
  28.     protected void onStart() {  
  29.         super.onStart();  
  30.         Log.i(TAG ,"Second-onStart");  
  31.     }  
  32.     //Activity从后台回到前台  
  33.     @Override  
  34.     protected void onRestart() {  
  35.         super.onRestart();  
  36.         Log.i(TAG ,"Second--onRestart");  
  37.     }  
  38.     @Override  
  39.     protected void onResume() {  
  40.         super.onResume();  
  41.         Log.i(TAG ,"Second--onResume");  
  42.     }  
  43.     @Override  
  44.     public void onWindowFocusChanged(boolean hasFocus) {  
  45.         super.onWindowFocusChanged(hasFocus);  
  46.         Log.i(TAG ,"Second--onWindowFocusChanged "+hasFocus);  
  47.     }  
  48.     @Override  
  49.     protected void onPause() {  
  50.         super.onPause();  
  51.         Log.i(TAG ,"Second--onPause");  
  52.     }  
  53.     @Override  
  54.     protected void onStop() {  
  55.         super.onStop();  
  56.         Log.i(TAG ,"Second--onStop");  
  57.     }  
  58.     @Override  
  59.     protected void onDestroy() {  
  60.         super.onDestroy();  
  61.         Log.i(TAG ,"Second--onDestroy");  
  62.     }  
  63. }  
当开启该程序时,输出log:

[plain]  view plain  copy
  1. First--onCreate  
  2. First--onStart  
  3. First--onResume  
  4. First--onWindowFocusChanged true  

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

[plain]  view plain  copy
  1. First--onPause  
  2. Second--onCreate  
  3. Second-onStart  
  4. Second--onResume  
  5. First--onWindowFocusChanged false  
  6. Second--onWindowFocusChanged true  
  7. First--onStop  

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

[plain]  view plain  copy
  1. First--onPause  
  2. First--onWindowFocusChanged false  
  3. Second--onCreate  
  4. Second--onStart  
  5. Second--onResume  
  6. Second--onWindowFocusChanged true  
  7. First--onStop  

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

[plain]  view plain  copy
  1. Second--onPause  
  2. Second--onWindowFocusChanged false  
  3. First--onRestart  
  4. First--onStart  
  5. First--onResume  
  6. First--onWindowFocusChanged true  
  7. Second--onStop  
当锁屏或屏幕休眠时,依次调用方法:

[html]  view plain  copy
  1. First--onPause  
  2. First--onStop  
重新解锁:

[html]  view plain  copy
  1. First--onRestart  
  2. First--onStart  
  3. First--onResume  
并没有调用onWindowFocusChanged方法。

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

[html]  view plain  copy
  1. First--onPause  
  2. First--onWindowFocusChanged false  
  3. First--onStop  
重新进入程序打开FirstActivity,获取焦点。调用方法:

[html]  view plain  copy
  1. First--onRestart  
  2. First--onStart  
  3. First--onResume  
  4. First--onWindowFocusChanged true  
当第一个界面弹出一个对话框(没有全部覆盖FirstActivity),或者SecondActivity是对话框形式的。方法如下:

[html]  view plain  copy
  1. First--onPause  
  2. First--onWindowFocusChanged false  
  3. Second--onCreate  
  4. Second-onStart  
  5. Second--onResume  
  6. Second--onWindowFocusChanged true  
  7. //第一个界面并没有调用onStop方法。只有全部覆盖才会调用onStop方法。  

猜你喜欢

转载自blog.csdn.net/sinat_17775997/article/details/80690216