Android开发学习 之 四、Activity

                                            四、Activity

4.1 Activity

Activity是应用程序的入口。负责创建才窗口(setContextView(View)),和用户交互等。

 

4.1.1 基本用法

首先定义一个类继承自android.app.Activity,在AndroidManifest.xml文件的application标签里声明一个activity即可。

一般一个程序可能会有多个Activity,需要指定程序运行时首先加载的Activity,在activity标签内部需要定义action 和category 。首先运行这个Activity。

 

一个Activity例子。设置ContentView,获取视图上的按钮,添加事件。

Java代码  
  1. public class ActivityMainExample extends Activity implements View.OnClickListener {  
  2.   
  3.     private Button button1;  
  4.     private Button button2;  
  5.     private Button button3;  
  6.   
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         Log.v(CommonConfig.LOG_TAG, "ActivityExample onCreate");  
  10.         super.onCreate(savedInstanceState);  
  11.         super.requestWindowFeature(Window.FEATURE_NO_TITLE);  
  12.         super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  13.         super.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  14.         super.setContentView(R.layout.main);  
  15.         this.button1 = (Button) super.findViewById(R.id.button1);  
  16.         this.button2 = (Button) super.findViewById(R.id.button2);  
  17.         this.button3 = (Button) super.findViewById(R.id.button3);  
  18.   
  19.         this.button1.setOnClickListener(this);  
  20.         this.button2.setOnClickListener(this);  
  21.         this.button3.setOnClickListener(this);  
  22.     }  
  23.   
  24.     @Override  
  25.     public void onClick(View v) {  
  26.         if (v.equals(this.button1)) {  
  27.               
  28.         } else if (v.equals(this.button2)) {  
  29.               
  30.         } else if (v.equals(this.button3)) {  
  31.         }  
  32.     }  
  33. }  
 

 

 

AndroidManifest配置。

Xml代码  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="liming.activity.example"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <activity android:name=".ActivityMainExample"  
  8.                   android:label="mainActivity"  
  9.                   android:launchMode="standard">  
  10.             <intent-filter>  
  11.                 <action android:name="android.intent.action.MAIN" />  
  12.                 <category android:name="android.intent.category.LAUNCHER" />  
  13.             </intent-filter>  
  14.         </activity>  
  15.     </application>  
  16.     <uses-sdk android:minSdkVersion="7" />  
  17.   
  18. </manifest>  
 

 

 

4.1.2 常用设置

AndroidManifest中的通常设置:

android:launchMode

启动模式

standard,singleTop,singleTask ,singleInstance,

android:screenOrientation

屏幕

landscape横屏,portrait竖屏

android:label

标题名称

直接写字符,或引用xml文件中的@string/

android:name

Activity类名

注意.。一般是manifest的package加name等于Activity类带包名的全称

 

 

 

Java常用方法

setContentView()

设置Activity视图

参数可以是①res/layout中的xml文件,通过R.layout获取int的id。②View类型的视图。

findViewById

寻找View,在XML

R中的id。一般设置setContentView为R中的layout,通过这个方法寻找每个组件的引用。

 

 

 

 

 

 

Java其他方法

去标题

super.requestWindowFeature(Window.FEATURE_NO_TITLE)需要在执行setContentView之前操作,否则报错。

全屏

super.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

横竖向

super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);/ ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

屏幕参数widht,height,dpi等

Display display = super.getWindowManager().getDefaultDisplay();

DisplayMetrics displayMetrics = new DisplayMetrics();

display.getMetrics(displayMetrics);

display.getWidth()等方法

displayMetrics.densityDpi等方法

 

 

 

 

4.1.3 生命周期


Activity有7个生命周期。Activity程序入口为方法onCreate或onStart。一些初始化的操作需要在这两个方法中进行,例如设置layout,初始化控件,添加事件监听等。

每次启动Activity都是从OnCreare开始,接着onStart,onResume。

按Back键就结束程序:onPause,onStop,onDestroy;

按home键切换程序:onPause,onStop,切换回来:onRestart,onStrat,onResume。

在两个以上Activity切换时。Activity是否被Destroy取决于启动模式launchMode。

 

 

onCreate

当首次创建Activity时调用。一些设置在该方法中进行:创建视图,数据绑定等。还以Bundle的形式提供以前存储的任何状态的访问。

onRestart

重新启动Activity时调用。该活动仍在内存中,而不是重起一个新的Activity。

onStart

当Activity在屏幕上可见时调用。跟着onResume(),

onResume

当Activity与用户交互时调用。

onPause

在系统启动恢复前一个活动时调用。这通常用于未保存的更改提交到持久性数据、 停止动画和其他可能会占用 CPU 等的东西。此方法的实现必须非常快速,因为此方法返回之前不会恢复的下一个活动。跟或 onResume(),如果活动返回到前面或 onStop(),如果它变得对用户不可见。

onStop

因为另一项Activity已恢复或启动,这个Activity已不再对的用户可见时调用。这可能发生或者因为正在启动一项新的Activity,现有之前的这一个Activity或被销毁。如果这个Activity出错或失败将 onDestroy(),如果被用户重新选中则调用 onRestart()。

onDestroy

Activity被销毁前的最后调用。发生这种情况是因为Activity被finishing (或称为 finish() ,或因为系统暂时销毁此活动的Activity以节省空间。您可以使用 isFinishing() 方法,区分这两种情况。

 

 

 

 

4.2.4 Activity加载模式

在配置文件中android:launchMode可以进行配置Activity加载模式。四种activity的加载模式:standard,singleTop,singleTask,singleInstance。

1. standard:默认,表示如果需要就创建。这样会导致,切换一次Activity,就创建一个。切换多少次,按back键就会返货多少次。

例如ActivityMain使用standard模式,当他转到ActivityOtherOne,又切换到ActivityMain时,原先在ActivityMain上面的EditText最开始输入的文字也就没有了。

2. singleTop:如果已经有一个这个Activity实例位于Activity栈的顶部时,就不产生新的实例。

3. singleTask: 会在一个新的task 中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。

4. singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task 中,只能有这个activity实例,不能有其他的实例。

 

 

4.2 Activity切换

首先简单介绍Intent(意图)。Intent类相当于平台中应用程序之间的通信网络,Intent是一个要执行的操作的抽象说明,相当于各个Activity之间的桥梁。在一个Activity中想切换到另一个Activity,需要使用方法startActivity,并需要定义一个Intent来指定意图的组件类。

 

4.2.1最简单的Activity切换

定义Intent,使用Intent设置需要切换到哪个Activity。使用Activity的startActivity(Intent)方法。

Java代码  
  1. Intent intent = new Intent(this, ActivityOtherOne.class);  
  2. super.startActivity(intent);  
 

 

 

4.2.2使用Intent传递数据

当然也可以在切换Activity的时候传递数据。可以直接使用intent的putExtra方法,也可以new一个Bundle传输入,但是需要让intent把bundle进行putExtras下。

 

传参数端的Activity:

Java代码  
  1. Intent intent = new Intent(this, ActivityOtherOne.class);  
  2. Bundle bundle = new Bundle();  
  3. bundle.putString("value1", "hello");  
  4. intent.putExtras(bundle);  
  5. intent.putExtra("value2","world");  
  6. super.startActivity(intent);  
 

 

 

接收方,例子中的ActivityOtherOne。需要在OnCreate方法中获取。

Java代码  
  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4. .  
  5. .  
  6. .  
  7.     String value1 = super.getIntent().getExtras().getString("value1");  
  8.     String value2 = super.getIntent().getExtras().getString("value2");  
  9.     this.myEditText.setText("value1: " + value1 + ", value2: " + value2);  
  10. }  
 

 

 

 

4.2.3带回传数据的

1,在主Activitiy(ActivityMainExample)需要使用startActivityForResult方法切换Activity。其中第二个参数requestCode,只有当>= 0,在转会此Activity时才会调用onActivityResult方法,得到回传数据。

 

ActivityMainExample类中代码

Java代码  
  1. Intent intent = new Intent(this, ActivityOtherOne.class);  
  2. Bundle bundle = new Bundle();  
  3. bundle.putString("value1", "hello");  
  4. intent.putExtras(bundle);  
  5. intent.putExtra("value2","world");  
  6. super.startActivityForResult(intent, 1);  
 

 

 

重写onActivityResult方法,获取回传数据

Java代码  
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     String result1 = data.getExtras().getString("result1");  
  4.     String result2 = data.getExtras().getString("result2");  
  5.     Log.v(CommonConfig.LOG_TAG, "ActivityExample onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);  
  6.     Log.v(CommonConfig.LOG_TAG, "ActivityExample onActivityResult data - result1: " + result1 + ", result2: " + result2);  
  7. }  
 

 

 

 

2,在另一个Activity插入回传数据,然后finish。

 

ActivityOtherTwo类中代码。

Java代码  
  1. @Override  
  2. public void onClick(View v) {  
  3.     super.getIntent().putExtra("result1", "hello android");  
  4.     super.getIntent().putExtra("result2", "hello google");  
  5.     super.setResult(Activity.RESULT_OK, super.getIntent());  
  6.     super.finish();  
  7. }  
 

 

 

 

4.3 其他常用的Activity


一些常用的Activity子类,后面将详细说明如何使用。写好后更新链接地址

ActivityGroup http://limingnihao.iteye.com/

TabActivity http://limingnihao.iteye.com/

ListActivity http://limingnihao.iteye.com/

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。