Android基础(六) Activity
1.什么是Activity
Activity是Android四大组件之一,程序显示的界面
2.如何创建Activity
需要定义一个类继承Activity
在清单文件AndroidManifest.xml的<application>节点中声明<activity>
3.启动Activity
使用显式意图
创建Intent对象,设置指定的类,调用startActivity(intent)方法来启动新的Activity
new Intent(this, NewActivity.class);
该方法一般用于同一个应用程序内部的Activity跳转
使用隐式意图
创建Intent对象,设置动作、数据、类型等信息,再使用startActivity(intent)方法来启动新的Activity
intent.setClassName(this, "cn.itcast.activity.NewActivity");
该方式灵活、可扩展性强
或者:
intent.setClassName("cn.itcast.downloader", "cn.itcast.downloader.MainActivity");
该方式可以启动其他应用程序中的Activity
4.关闭Activity
执行finish()方法
5.启动Activity时传递数据
使用启动Activity的意图对象Intent.putExtra()方法可以携带一些数据到新的Activity中,在新的Activity中可以调用getIntent()方法得到Intent对象,再通过该Intent调用getStringExtra()、getIntExtra()等方法即可得到传递过来的数据。
Intent中可以携带8种基本数据类型:基本数据类型的数组、Bundle、CharSequence、Serializable、Parcelable
6.关闭Activity时返回数据
如果启动Activity时,需要目标Activity返回数据,那么就要使用startActivityForResult(Intent intent, int requestCode)方法来打开Activity,并重写onActivityResult(int requestCode, int resultCode, Intent data) 方法,该方法在目标Activity结束时自动执行,该方法的参数即是目标Activity传回的结果数据。
而在目标Activity中需要调用setResult(int resultCode, Intent data)方法用于设置返回数据,当前目标Activity关闭时就会调用来源Activity的onActivityResult(int requestCode, int resultCode, Intent data) 方法。
7.使用隐式意图创建Activity
显式意图是指在创建意图时指定了组件,而隐式意图则不指定组件,通过动作、类型、数据匹配对应的组件
需要在清单文件中定义<activity>时,同时定义<intent-filter>才能被隐式意图启动。
<intent-filter>中至少要配置一个<action>和一个<category>,否则Activity无法被隐式意图启动。
Intent对象中设置的action、category、data,在<intent-filter>中必须全部包含时才能启动Activity。
<intent-filter>中的<action>、<category>、<data>都可以配置多个,Intent对象中不需要全部匹配,每个标签各匹配一个即可启动Activity。
如果一个Intent可以匹配多个Activity,Android系统会提示用户进行选择。
public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void explicit(View view) { Intent intent = new Intent(this, OtherActivity.class); // intent.setClass(this, OtherActivity.class); // intent.setClassName(this, "com.xxx.activity.OtherActivity"); // intent.setClassName("com.xxx.activity", "com.xxx.activity.OtherActivity"); startActivity(intent); } public void implicit(View view) { Intent intent = new Intent(); /* // 拨打电话 intent.setAction("android.intent.action.CALL"); intent.setData(Uri.parse("tel://18600012345")); */ /* // 打开浏览器 intent.setAction("android.intent.action.VIEW"); intent.setData(Uri.parse("http://192.168.1.253:8080/15.Web")); */ /* // 播放音频 intent.setAction("android.intent.action.VIEW"); intent.setDataAndType(Uri.parse("file:///mnt/sdcard/Adele - Rolling in the Deep.mp3"), "audio/*"); */ /* // 播放视频 intent.setAction("android.intent.action.VIEW"); intent.setDataAndType(Uri.parse("file:///mnt/sdcard/1.mp4"), "video/*"); */ /* // 显示图片 intent.setAction("android.intent.action.VIEW"); intent.setDataAndType(Uri.parse("file:///mnt/sdcard/9.jpg"), "image/*"); */ /* intent.setAction("com.xxx.action.OTHER_ACTIVITY"); */ startActivity(intent); } public void send(View view) { Intent intent = new Intent(this, OtherActivity.class); // 用来启动Activity, 发送广播, 启动服务 /* intent.putExtra("name", "张三"); // 用Intent传递数据 intent.putExtra("age", 18); */ /* Bundle bundle1 = new Bundle(); bundle1.putString("name", "张三"); bundle1.putInt("age", 18); Bundle bundle2 = new Bundle(); bundle2.putString("name", "李四"); bundle2.putInt("age", 19); intent.putExtra("bundle1", bundle1); intent.putExtra("bundle2", bundle2); */ Person p1 = new Person("王五", 20); Person p2 = new Person("赵六", 21); intent.putExtra("p1", p1); intent.putExtra("p2", p2); startActivity(intent); } public void result(View view) { Intent intent = new Intent(this, OtherActivity.class); intent.putExtra("name", "张三"); intent.putExtra("age", 18); startActivityForResult(intent, 100); // 启动一个Activity, 等待返回结果 } // 当前Activity启动的新Activity关闭时, 就会自动执行这个方法 protected void onActivityResult(int requestCode, int resultCode, Intent data) { TextView mainTV = (TextView) findViewById(R.id.mainTV); mainTV.setText(data.getStringExtra("name") + ": " + data.getIntExtra("age", -1)); } }
public class OtherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.other); TextView otherTV = (TextView) findViewById(R.id.otherTV); Intent intent = getIntent(); String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age", -1); otherTV.setText(name + ": " + age); /* Bundle bundle1 = intent.getBundleExtra("bundle1"); Bundle bundle2 = intent.getBundleExtra("bundle2"); String name1 = bundle1.getString("name"); int age1 = bundle1.getInt("age"); String name2 = bundle2.getString("name"); int age2 = bundle2.getInt("age"); otherTV.setText(name1 + ": " + age1 + "; " + name2 + ": " + age2); */ /* Person p1 = (Person) intent.getSerializableExtra("p1"); Person p2 = (Person) intent.getSerializableExtra("p2"); otherTV.setText(p1.getName() + ": " + p1.getAge() + "; " + p2.getName() + ": " + p2.getAge()); */ Intent data = new Intent(); data.putExtra("name", "王五"); data.putExtra("age", 21); setResult(200, data); // 设置了结果数据 } public void close(View view) { finish(); // 关闭当前Activity } }
public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }