Activity是Android系统中最重要的也是最基本的组件。每一个Activity可以通过布局文件、Java程序或者两者相结合的方式来绘制用户界面。一个应用程序通常由多个Activity组成,它们之间通过组件通信技术形成一个有机的整体,通常是松耦合关系,一个应用程序有多个页面,每个页面通常都用一个Activity来控制。
5.1.1 Activity配置所有的组件(每一个Activity)都必须显式的在AndroidManifest.xml文件中进行配置,在元素中的子元素中为Activity进行配置,修改该元素即可修改该Activity的配置,配置代码如下所示:
//对应的是res/values/strings文件中的appa_name
//intent过滤器,指定接收者响应Intent需要的类型,过滤符合要求的Activity
//每一个Activity都需要相应的配置
5.1.2 启动和关闭Activity
通常,当一个应用程序启动的时候,会呈现给用户一个界面,这个界面由某个Activity来管理,这个Activity称之为MainActivity。
1).启动Activity
(1)startActivity(Intent intent):启动Activity,其中参数intent描述待启动的Activity的信息;
ActivityA启动ActivityB的代码如下:
Intent intent=new Intent(A.this,B.class);
startActivity(intent);
除了上述启动应用程序中自定义的Activity外,有时候我们需要启动系统级的应用程序,例如,我们希望通过界面的电话号码直接拨打电话,这时候我么需要启动手机中的电话程序,代码如下:
Intent intent=new Intent(Intent.ACTION_DIAL); // ACTION_DIAL表示显示拨号面板
Intent.setData(Uri.parse(“tel:114”));
startActivity(intent);
(2)startActivityForResult(Intent intent,int requestCode):以指定请求码requestCode启动Activity
2).关闭Activity
(1)finish():结束当前Activity
(2)finishActivity(int requestCode):结束以startActivityForResult(Intent intent,int requestCode)方法启动的Activity
举例1:建立三个页面,可以实现页面的跳转,如下图所示:
1~创建工程,命名为ActivityDemo,默认包名。
在工程目录src/包下:删除MainActivity,再分别创建文件FistActivity.java, SecondActivity.java,ThreeActivity.java,代码分别如下:
FistActivity.java中的代码如下:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class FistActivity extends Activity{
private Button btnnext1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fist);
btnnext1=(Button) findViewById(R.id.btnnext1);
btnnext1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(FistActivity.this,SecondActivity.class);
startActivityForResult(intent, 0);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
SecondActivity.java中的代码如下:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends Activity {
private Button btnnext2, btnprevious2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
btnnext2 = (Button) findViewById(R.id.btnnext2);
btnprevious2 = (Button) findViewById(R.id.btnprevious2);
btnnext2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(SecondActivity.this,
ThreeActivity.class);
startActivityForResult(intent, 0);
}
});
btnprevious2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(SecondActivity.this,
FistActivity.class);
startActivityForResult(intent, 0);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
ThreeActivity.java中的代码如下:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class ThreeActivity extends Activity {
private Button btnnext3, btnprevious3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.three);
btnprevious3 = (Button) findViewById(R.id.btnprevious3);
btnprevious3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(ThreeActivity.this,
SecondActivity.class);
startActivityForResult(intent, 0);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
2~在工程目录res/layout目录下,新建fist.xml,second.xml,three.xml,代码分别如下:
fist.xml代码如下:
second.xml代码如下:
three.xml中的代码如下:
3~在工程目录res/values目录下Strings.xml中的代码如下:
第一页
第二页
第三页
Settings
Hello world!
4~双击工程目录下部署文件AndroidManifest.xml文件,配置activity.java文件,特别注意这里的android:name="com.example.demo7.ActivityA" ,这里配置的是你对应的包的名字,请注意查看自己的包,做相应的修改
运行程序。
课堂练习:在上面例子的基础上,加一个第四页,参考第二页修改第三页,然后实现页面之间的相互跳转。
5.1.3 使用Bundle在Activity之间交换数据当Activity相互之间进行调用的时候,往往会需要传递一些数据。Android将通信数据封装成以键值对(key-value)形式表示的Bundle对象,两个activity是通过intent通信的,只需将Bundle数据放入到Intent,通过调用Intent对象的方法就可以实现数据传递。
Intent提供了以下四种方法来设置传递的通信数据。
- putExtras(Bundle data):向Intent中放入需要“携带“的数据data
- putExtra(String name, Xxx value):向Intent中按key-value对的形式存入数据,Xxx指各种数据类型。
- putXxx(String key,Xxx data):向Bundle放入Int,Long等各种类型的数据
- putSerializable(String key,Serializable data):向Bundle中放入一个可序列化的对象getExtras():取出Intent所“携带”的数据
相应的,Intent也提供了相应的去除传递过来的数据的方法。
- getXxxExtra(String name):取出从Intent中key为name的数据
- getXxx(String key):从Bundle取出Int,Long 等各种数据类型的数据
- getSerializable(String Key,Serializable data):从Bundle取出一个可序列化的对象
例如:ActivityA启动ActivityB,并携带name数据传递给ActivityB。相对于的代码如下:
Intent intent=new Intent(ActivityA.this, ActivityB.class);
Bundle bundle=new Bundle();
bundle.putString(“name”,”Tom”); //把name作为键,Tom作为值放进bundle中
intent.putExtras(bundle);
startActivity(intent);
ActivityB获取传递过来的数据,相对应的代码如下:
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String name=bundle.getString(“name”);
4.1.4 调用另一个Activity并返回结果
如果启动另一个Activity,并且希望返回结果给当前的Activity,那么可使用startActivityForResult()方法来启动Activity。
(1)当前的Activity要重写onActivityResult(int requestCode, int resultCode, Intent intent)方法
(2)被启动的Activity需要调用setResult()方法设置返回结果。
【例3.1】实现数据交互的Activity之间的通信,由组件A向组件B发送一个数据。
1)创建工程,命名为IntentDemo,默认包名。
2)在工程目录src/包下:删除MainActivity.java,创建文件ActivityA.java,代码如下 :
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class ActivityA extends Activity {
private EditText txt;
private Button btnA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
txt = (EditText) findViewById(R.id.txt);
btnA = (Button) findViewById(R.id.btnA);
btnA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(ActivityA.this,ActivityB.class);
Bundle bundle=new Bundle();
String value=txt.getText().toString();
bundle.putString("message", value);
intent.putExtras(bundle);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3)在工程目录src/包下,创建ActivityB.java代码如下:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class ActivityB extends Activity {
private EditText txtB;
private Button btnB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
txtB = (EditText) findViewById(R.id.txtB);
btnB = (Button) findViewById(R.id.btnB);
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
String mess = bundle.getString("message");
txtB.setText(mess);
btnB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(ActivityB.this,ActivityA.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
4)在res/layout/目录下,删除原有的activity_main.xml,新建文件:activity_a.xml,代码如下:
5)在res/layout/目录下,新建文件:activity_b.xml,代码如下:
6)双击res/values/目录下strings文件,修改代码如下:
demo10
demo10_a
demo10_b
Settings
Hello world!
7) 双击工程目录下部署文件AndroidManifest.xml文件,配置activity.java文件,特别注意这里的android:name="com.example.demo1.ActivityA" ,这里配置的是你对应的包的名字,请注意查看自己的包,做相应的修改。
课后练习:在这个例子的基础上,建立第三个页面,由第二个页面把接收到的数据发送到页面三。
【例3.2】实现数据交互的Activity之间的通信。(由B返回数据到A)
1)创建工程,命名为ActivityIntentDemo,默认包名。
2)在工程目录src/包下:删除MainActivity.java,创建文件ActivityA.java,代码如下 :
package com.mialab.activityintentdemo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class ActivityA extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Button btn=(Button)findViewById(R.id.btnA);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent=new Intent(ActivityA.this,ActivityB.class);
startActivityForResult(intent, 0);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{
// 当requestCode、resultCode同时为0,也就是处理特定的结果
if (requestCode == 0 && resultCode == 0)
{
// 取出Intent里的Extras数据
Bundle data = intent.getExtras();
// 取出Bundle中的数据
String name = data.getString("name");
// 设置文本框的内容
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(name);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3)在工程目录src/包下,创建ActivityB.java代码如下:
package com.mialab.activityintentdemo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class ActivityB extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
Button btn=(Button)findViewById(R.id.btnB);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
EditText txt=(EditText)findViewById(R.id.txtNameB);
Intent intent=getIntent();
Bundle bundle=new Bundle();
bundle.putString("name",txt.getText().toString());
intent.putExtras(bundle);
ActivityB.this.setResult(0, intent);
ActivityB.this.finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
}
4)在res/layout/目录下,删除原有的activity_main.xml,新建文件:activity_a.xml,代码如下:
5)在res/layout/目录下,新建文件:activity_b.xml,代码如下:
6)在res/menu/目录下,新建文件:activity_b.xml,代码如下:
7)双击res/values/目录下strings文件,修改代码如下:
ActivityA
Settings
Hello world!
ActivityB
8) 双击工程目录下部署文件AndroidManifest.xml文件,配置activity.java文件,特别注意这里的android:name="com.example.demo1.ActivityA" ,这里配置的是你对应的包的名字,请注意查看自己的包,做相应的修改。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)