【移动应用开发技术】玩转Android之Activity详细剖析_第1页
【移动应用开发技术】玩转Android之Activity详细剖析_第2页
【移动应用开发技术】玩转Android之Activity详细剖析_第3页
【移动应用开发技术】玩转Android之Activity详细剖析_第4页
【移动应用开发技术】玩转Android之Activity详细剖析_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】玩转Android之Activity详细剖析

本文主讲了什么是Activity,它的生命周期,不对的操作,调用了什么函数。以及不同的Activity之间的跳转、数据传递等。

Activity是用户接口程序,原则上它会提供给用户一个交互式的接口功能。它是android应用程序的基本功能单元。Activity本身是没有界面的。所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道。一、Activity的生命周期简介1、操纵生命周期的七种方法:

2、Activity的运作流程一般启动Activity:onCreate->onStart->onResume呼叫另一个Activity:onPause->onCreate->onStart->onResume->onStop还原Activity:onPause->onRestart->onStart->onResume->onStop->onDestroy退出Activity:onPause->onStop->onDestroy回收再启动Activity:onCreate->onStart–>onResume3、Activity生命周期的四种基本状态:(1)Active/Runing:一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。(2)Paused:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。(3)Stoped。当Activity被另外一个Activity覆盖、失去焦点并不可见时处于Stoped状态。(4)KilledActivity。被系统杀死回收或者没有被启动时处于Killed状态。

二、Activity生命周期代码范例

1:

/**

2:

*Activity生命周期学习

3:

*@author

林炳文(博客

)

4:

*@time

2015.3.19

5:

*/

6:

package

com.example.activitylearning;

7:

import

android.os.Bundle;

8:

import

android.app.Activity;

9:

import

android.util.Log;

10:

public

class

MainActivity

extends

Activity

{

11:

private

static

final

String

TAG="AvtivityTest";

12:

@Override

13:

protected

void

onCreate(Bundle

savedInstanceState)

{

14:

super.onCreate(savedInstanceState);

15:

Log.d(TAG,

"onCreate()

called");

16:

setContentView(R.layout.activity_main);

17:

}

18:

@Override

19:

protected

void

onStart(){

20:

super.onStart();

21:

Log.d(TAG,

"onStart()

called");

22:

23:

}

24:

@Override

25:

protected

void

onResume(){

26:

super.onResume();

27:

Log.d(TAG,"onResume()

called");

28:

29:

}

30:

@Override

31:

protected

void

onPause(){

32:

super.onPause();

33:

Log.d(TAG,

"onPause()

called");

34:

35:

}

36:

@Override

37:

protected

void

onStop(){

38:

super.onStop();

39:

Log.d(TAG,

"onStop()

called");

40:

41:

}

42:

protected

void

onDestroy(){

43:

super.onDestroy();

44:

Log.d(TAG,

"onDestroy()

called");

45:

46:

}

47:

48:

49:

}

1、程序启动一般启动Activity:onCreate->onStart->onResume

2、程序启动后按下后退键退出Activity:onPause->onStop->onDestroy可以看到,程序已退出了。3、程序启动后按下主屏幕键还原Activity:onPause->onRestart->onStart->onResume->onStop->onDestroy再打开程序:

三、多个Activity管理1、Android是通过一种Activity栈的方式来管理Activity的,一个Activity的实例的状态决定它在栈中的位置。2、处于前台的Activity总是在栈的顶端,当前台的Activity因为异常或其它原因被销毁时,处于栈第二层的Activity将被激活,上浮到栈顶。3、当新的Activity启动入栈时,原Activity会被压入到栈的第二层。一个Activity在栈中的位置变化反映了它在不同状态间的转换注意:在Android系统中,要使用Activity必须在AndroidManifest.xml文件中进行配置。在<application…/>元素中添加<activity…/>子元素即可配置Activity通常指定如下三个属性:–name:指定该Activity的实现类。–icon:指定该Activity对应的图标。–label:指定该Activity的标签。四、由一个Activity启动另一个Activity(不带数据传递)1、布局activity_1.xml(放在layout)

1:

<RelativeLayout

xmlns:android="/apk/res/android"

2:

xmlns:tools="/tools"

3:

android:layout_width="match_parent"

4:

android:layout_height="match_parent"

5:

tools:context=".Activity1"

>

6:

<Button

7:

android:id="@+id/id_button1"

8:

android:layout_width="match_parent"

9:

android:layout_height="wrap_content"

10:

android:text="启动Activity2"

11:

/>

12:

</RelativeLayout>activity_2.xml

1:

<RelativeLayout

xmlns:android="/apk/res/android"

2:

xmlns:tools="/tools"

3:

android:layout_width="match_parent"

4:

android:layout_height="match_parent"

>

5:

<Textview

6:

android:text="欢迎来到Activity2"

7:

android:layout_centerInParent="true"

8:

android:layout_width="match_parent"

9:

android:layout_height="wrap_content"

10:

android:textSize="30sp"

11:

/>

12:

</RelativeLayout>2、对应的代码:Activity1.java

1:

/**

2:

*Activity生命周期学习

3:

*@author

林炳文(博客

/evankaka/)

4:

*@time

2015.3.19

5:

*/

6:

package

com.example.activitylearning;

7:

import

android.os.Bundle;

8:

import

android.app.Activity;

9:

import

android.content.Intent;

10:

import

android.util.Log;

11:

import

android.view.View;

12:

import

android.view.View.OnClickListener;

13:

import

android.widget.Button;

14:

public

class

Activity1

extends

Activity

{

15:

private

static

final

String

TAG="Avtivity1";

16:

private

Button

mButton;

17:

18:

@Override

19:

protected

void

onCreate(Bundle

savedInstanceState)

{

20:

super.onCreate(savedInstanceState);

21:

Log.d(TAG,

"onCreate()

called");

22:

setContentView(R.layout.activity_1);

23:

mButton=(Button)findViewById(R.id.id_button1);

24:

mButton.setOnClickListener(new

OnClickListener()

{

25:

@Override

26:

public

void

onClick(View

arg0)

{

27:

startActivity(new

Intent(Activity1.this,Activity2.class));

28:

29:

}

30:

});

31:

}

32:

@Override

33:

protected

void

onStart(){

34:

super.onStart();

35:

Log.d(TAG,

"onStart()

called");

36:

37:

}

38:

@Override

39:

protected

void

onResume(){

40:

super.onResume();

41:

Log.d(TAG,"onResume()

called");

42:

43:

}

44:

@Override

45:

protected

void

onPause(){

46:

super.onPause();

47:

Log.d(TAG,

"onPause()

called");

48:

49:

}

50:

@Override

51:

protected

void

onStop(){

52:

super.onStop();

53:

Log.d(TAG,

"onStop()

called");

54:

55:

}

56:

protected

void

onDestroy(){

57:

super.onDestroy();

58:

Log.d(TAG,

"onDestroy()

called");

59:

60:

}

61:

62:

63:

}Activity2.java

1:

package

com.example.activitylearning;

2:

3:

import

android.app.Activity;

4:

import

android.os.Bundle;

5:

import

android.util.Log;

6:

7:

public

class

Activity2

extends

Activity

{

8:

private

static

final

String

TAG="Avtivity2";

9:

@Override

10:

protected

void

onCreate(Bundle

savedInstanceState)

{

11:

super.onCreate(savedInstanceState);

12:

Log.d(TAG,

"onCreate()

called");

13:

setContentView(R.layout.activity_2);

14:

}

15:

@Override

16:

protected

void

onStart(){

17:

super.onStart();

18:

Log.d(TAG,

"onStart()

called");

19:

20:

}

21:

@Override

22:

protected

void

onResume(){

23:

super.onResume();

24:

Log.d(TAG,"onResume()

called");

25:

26:

}

27:

@Override

28:

protected

void

onPause(){

29:

super.onPause();

30:

Log.d(TAG,

"onPause()

called");

31:

32:

}

33:

@Override

34:

protected

void

onStop(){

35:

super.onStop();

36:

Log.d(TAG,

"onStop()

called");

37:

38:

}

39:

protected

void

onDestroy(){

40:

super.onDestroy();

41:

Log.d(TAG,

"onDestroy()

called");

42:

43:

}

44:

45:

}3、Activity注册Androidmanifest.xml中增加:

1:

<activity

2:

android:name="com.example.activitylearning.Activity2"

3:

android:label="@string/app_name">

4:

</activity>

4、运行结果(1)、在Activity中点击按钮:启动Activity2从上面可以看出Activity1没被毁掉,而是变成Stop()了,当前变成不可见。(2)然后再点击后退键:

五、由一个Activity启动另一个Activity(带数据传递)1、界面activity_1.xml(放在layout)

1:

<RelativeLayout

xmlns:android="/apk/res/android"

2:

xmlns:tools="/tools"

3:

android:layout_width="match_parent"

4:

android:layout_height="match_parent"

5:

tools:context=".Activity1"

>

6:

<Button

7:

android:id="@+id/id_button1"

8:

android:layout_width="match_parent"

9:

android:layout_height="wrap_content"

10:

android:text="启动Activity2"

11:

/>

12:

13:

<EditText

14:

android:id="@+id/id_edittext1"

15:

android:layout_below="@id/id_button1"

16:

android:layout_width="match_parent"

17:

android:layout_height="wrap_content"

18:

/>

19:

<EditText

20:

android:id="@+id/id_edittext2"

21:

android:layout_below="@id/id_edittext1"

22:

android:layout_width="match_parent"

23:

android:layout_height="wrap_content"

24:

/>

25:

</RelativeLayout>activity_2.xml(放在layout)

1:

<RelativeLayout

xmlns:android="/apk/res/android"

2:

xmlns:tools="/tools"

3:

android:layout_width="match_parent"

4:

android:layout_height="match_parent"

>

5:

<TextView

6:

android:id="@+id/id_textview1"

7:

android:layout_width="match_parent"

8:

android:layout_height="wrap_content"

9:

android:textSize="30sp"

10:

/>

11:

<TextView

12:

android:id="@+id/id_textview2"

13:

android:layout_below="@id/id_textview1"

14:

android:layout_width="match_parent"

15:

android:layout_height="wrap_content"

16:

android:textSize="30sp"

17:

/>

18:

</RelativeLayout>两个效果如下:

2、主要代码。Activity1.java中

1:

Intent

mIntent=new

Intent(Activity1.this,Activity2.class);

2:

String

mString1

=

mEditText1.getText().toString();

3:

String

mString2

=

mEditText1.getText().toString();

4:

mIntent.putExtra("one",mString1);

5:

mIntent.putExtra("two",mString2);

6:

startActivity(mIntent);Activity2.java中

1:

mTextView1=(TextView)findViewById(R.id.id_textview1);

2:

mTextView2=(TextView)findViewById(R.id.id_textview1);

3:

4:

String

mString1=getIntent().getStringExtra("one");

5:

String

mString2=getIntent().getStringExtra("two");

6:

7:

mTextView1.setText(mString1);

8:

mTextView2.setText(mString1);3、运行结果

左边为Activity1,右边为Activity2.它会得到Activity1的结果并在TextView中显示出来六、得到返回的Activity的数据这里要实现在Activity1中的两个EditText中输入内容,打开Activity2,将Activity1中的两个EditText的内容显示在Activity2的两个TextView中。在在Activity2中的两个EditText中输入内容,按下返回键,将Activity2中的两个EditText的内容显示在Activity1的两个TextView中。1、布局

2、主要代码Activity1.java中:

1:

mButton=(Button)findViewById(R.id.id_button1);

2:

mButton.setOnClickListener(new

OnClickListener()

{

3:

@Override

4:

public

void

onClick(View

arg0)

{

5:

Intent

mIntent=new

Intent(Activity1.this,Activity2.class);

6:

String

mString1

=

mEditText1.getText().toString();

7:

String

mString2

=

mEditText2.getText().toString();

8:

mIntent.putExtra("one",mString1);

9:

mIntent.putExtra("two",mString2);

10:

startActivityForResult(mIntent,

0);

11:

12:

}

13:

});注意要用startActivityForResult(mIntent,0);//0表示标识,等下Activity也要标志为0然后是处理Activity2返回后的事件

1:

@Override

2:

protected

void

onActivityResult(int

requestCode,

int

resultCode,

Intent

data)

{

3:

super.onActivityResult(requestCode,

resultCode,

data);

4:

if(null==data)

5:

return;

6:

TextView

mTextView3=(TextView)findViewById(R.id.id_textview3);

7:

TextView

mTextView4=(TextView)findViewById(R.id.id_textview4);

8:

9:

String

mString3=data.getStringExtra("three");

10:

String

mString4=data.getStringExtra("four");

11:

12:

mTextView3.setText(mString3);

13:

mTextView4.setText(mString4);

14:

}Activity2.java中:在按下返回键的事件中,增加一些数据传递,其实这里主要是setResult(0,result);注意0要和上面的startActivityForResult(mIntent,0);对应。

1:

@Override

2:

public

boolean

onKeyDown(int

keyCode,

KeyEvent

event)

{

3:

if

(keyCode

==

KeyEvent.KEYCODE_BACK

&&

event.getRepeatCount()

==

0)

{

4:

5:

EditText

mEditText3=(EditText)findViewById(R.id.id_edittext3);

6:

EditText

mEditText4=(EditText)findViewById(R.id.id_edittext4);

7:

String

mData1

=

mEditText3.getText().toString();

8:

String

mData2

=

mEditText4.getText().toString();

9:

Intent

result

=

new

Intent();

10:

result.putExtra("three",

mData1);

11:

result.putExtra("four",

mData2);

12:

setResult(0,

result);

13:

14:

}

15:

return

super.onKeyDown(keyCode,

event);

16:

}3、效果从Activity1中启动Activity2,可以看到,数据传递过去了

Activity1

Activity2从Activity2中返回到Activity1中,可以看到,数据返回了

Activity2

Activity1八、额外内容Activity返回值

使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会提供任何反馈。可变通的,你可以启动一个Activity作为子Activity,它与父Activity有内在的联系。当子Activity关闭时,它会触发父Activity中的一个事件处理函数。子Activity最适合用在一个Activity为其它的Activity提供数据(例如用户从一个列表中选择一个项目)的场合。

子Activity的创建和普通Activity的创建相同,也必须在应用程序的manifest中注册。任何在manifest中注册的Activity都可以用作子Activity。启动子Activity

startActivityForResult方法和startActivity方法工作很相似,但有一个很重要的差异。Intent都是用来决定启动哪个Activity,你还可以传入一个请求码。这个值将在后面用来作为有返回值Activity的唯一ID。下面的代码显示了如何启动一个子Activity:

privatestaticfinalintSHOW_SUBACTIVITY=1;

Intentintent=newIntent(this,MyOtherActivity.class);

startActivityForResult(intent,SHOW_SUBACTIVITY);

和正常的Activity一样,子Activity可以隐式或显式启动。下面的框架代码使用一个隐式的Intent来启动一个新的子Activity来挑选一个联系人:

privatestaticfinalintPICK_CONTACT_SUBACTIVITY=2;

Uriuri=Uri.parse(“content://contacts/people”);

Intentintent=newIntent(Intent.ACTION_PICK,uri);

startActivityForResult(intent,PICK_CONTACT_SUBACTIVITY);返回值当子Activity准备关闭时,在finish之前调用setResult来给调用的Activity返回一个结果。setResult方法带两个参数:结果码和表示为Intent的负载值。结果码是运行子Activity的结果,一般是Activity.RESULT_OK或Activity.RESULT_CANCELED。在一些情况下,你会希望使用自己的响应代号来处理特定的应用程序的选择;setResult支持任何整数值。作为结果返回的Intent可以包含指向一个内容(例如联系人,电话号码或媒体文件)的URI和一组用来返回额外信息的Extra。接下来的代码片段节选自子Activity的onCreate方法,显示了怎样向调用的Activity返回不同的结果:

1:

Button

okButton

=

(Button)

findViewById(R.id.ok_button);

2:

3:

okButton.setOnClickListener(new

View.OnClickListener()

{

4:

5:

public

void

onClick(View

view)

6:

7:

{

8:

9:

Uri

data

=

Uri.parse(“content://horses/”

+

selected_horse_id);

10:

11:

Intent

result

=

new

Intent(null,

data);

12:

13:

result.putExtra(IS_INPUT_CORRECT,

inputCorrect);

14:

15:

result.putExtra(SELECTED_PISTOL,

selectedPistol);

16:

17:

setResult(RESULT_OK,

result);

18:

19:

finish();

20:

21:

}

22:

23:

});

24:

25:

Button

cancelButton

=

(Button)

findViewById(R.id.cancel_button);

26:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论