版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】玩转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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2022年人教部编版六年级语文上册期末测试卷及答案【完美版】
- 2022年部编人教版三年级语文上册期末测试卷【含答案】
- 2023年部编版八年级语文上册期末模拟考试(参考答案)
- 新人教版七年级物理上册期末考试题及答案
- 新人教部编版六年级语文上册期末测试卷(含答案)
- 部编版六年级《上册语文》期末试卷及答案【可打印】
- 一、总体概述:施工组织总体设想、方案针对性及施工段划分
- 实验室生物安全管理委员会职责范文
- 管理人员进场安全交底表
- ALC外墙板施工方案
- 中国电信客户服务
- (2022版)胰岛素抵抗专家共识
- 体育卫生知识讲座
- 供应商罚款联络函
- 无人机表演应急预案
- 宣传文员培训课件
- 各类单抗治疗的护理课件
- 理疗细节服务流程
- 2024年执业药师重点讲义西药综合
- 工程监理的行业标准与规范研究
- 质量管理的调研报告
评论
0/150
提交评论