首页 > 代码库 > Android 四大组件之 Activity
Android 四大组件之 Activity
1、综述
Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满屏的,但也可以是一个小的位于其它Activity之上的浮动窗口。一个Android工程至少有一个Activity,Activity上面可布有多个view实例,如文本框、进度条、复选框、按钮等等。多个Activity之间通过Intent来实现跳转。
[1]新建一个activity
(1)要继承(extends)Activity类,复写onCreate(bundle)方法,然后通过" setContentView() "绑定此activity的布局文件XML。
public class secondactivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.secondactivity);//绑定布局文件 }}
(2)还必须在AndroidManifest.xml里面注册这个新增加的activity。
<activity android:label="second" android:name=".secondactivity" //activity所在.java类 ></activity>
2、Intent的类来实现屏幕之间的跳转:
[1]显示意图跳转:要求必须知道被激活组件的包和class。
应用场景:在应用程序内部进行跳转。 缺点:耦合性较高。
常规使用方式:
(1)在layout中的" activity_main.xml " 中加入一个id为btn的按钮,另外再创建一个任意的layout(将要跳转到得layout),我取名为second。
(2)在java包中新增" SecondActivity.jar "作为目标Activity,如下:
package com.myandroid;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); }}
(3)在AndroidManifest中加入一个新的activity标签,至少要声明一个android:name属性,如下:
<activity android:name=".SecondActivity"> </activity>
(4)在起始Activity中添加跳转,需引入import android.content.Intent;命名空间,如下:
package com.myandroid;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.widget.Button;import android.content.Intent;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) this.findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(); //实例化Intent类 intent.setClass(MainActivity.this, SecondActivity.class); //跳转 startActivity(intent); //启动 finish();//停止当前的Activity,如果不写,则按返回键会跳转回原来的Activity } }); }}
另外两种显示方式:
/*** 方法一 ***/
Intent intent1 = new Intent();
// 第一个参数是当前的包名,第二个参数是跳转activity的类名,一定要加上包名
intent1.setClassName("com.myandroid.intent", "com.myandroid.intent.SecondActivity");
startActivity(intent1);
/*** 方法二 ***/
//第一个参数是Context,第二个参数是跳转Activity的类 Intent intent2 = new Intent(this, SecondActivity.class);
startActivity(intent2); /*** 方法三 ***/ Intent intent3 = new Intent(); ComponentName component = new ComponentName("com.myandroid.intent", "com.myandroid.intent.SecondActivity"); intent3.setComponent(component); startActivity(intent3);
[2]隐式意图:只需要知道跳转activity的动作和数据,就可以激活对应的组件。
应用场景:在不知道某一应用程序的类名,包名,并且引用不到时。可以跳转到其他应用。带参数访问浏览器的实现。 优点:耦合性较低。
注意:data与type不可以分开写,使用setDataAndType()方法 常规使用方式:
(1)在AndroidManifest中加入一个新的activity标签,要用隐式的意图激活Activity,就要设置动作,类别,数据三个参数,Action及Category的名称是可以自己定义的,只要与openOtherActivity方法中对Intent的设置相一致就可以被过滤器找到并最终激活。如下:
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="com.myandroid.SecondActivity" /> <category android:name="com.myandroid.Default" /> <data android:host="cn.itcast.demo" android:scheme="itcast" /> </intent-filter></activity>
(2)对Intent的设置如下。
/*** 隐式意图***/ Intent intent = new Intent();
//只要动作名称与过滤器中的动作名称一致,就可以匹配,如果匹配成功就可以查看类别及数据
//如果没有类别及数据,那么只会匹配动作
intent.setAction("com.android.SecondActivity");
intent.addCategory("com.android.Default");
//startActivity(intent)为Intent对象注入了一个android.intent.category.DEFAULT类别,必须添加该类别,不然报错找不到activity;
//intent.addCategory("android.intent.category.DEFAULT");
// 如果在声明activity的时候指定了data属性,在跳转的时候就一定要设置他的data属性值,和配置的属性值相等,不然也会报找不到的错误 intent.setData(Uri.parse("itcast://cn.itcast.demo")); startActivity(intent); Intent imageIntent = new Intent(); imageIntent.setAction(Intent.ACTION_PICK); imageIntent.setType("image/*");// 设置数据类型 startActivity(imageIntent);
运行发现报错:
原因:startActivity(intent)为Intent对象注入了一个android.intent.category.DEFAULT类别,必须添加该类别,不然报错找不到activity;
解决:在AndroidManifest中对应的activity中的intent-filter下,添加对应的<categoryandroid:name="android.intent.category.DEFAULT"/>类别。
此时运行程序,发现也是可以的,可以跳转成功。
结论:只要Intent设置中的action及category在intent-filter中出现,就可以成功跳转,前提是在没有设置数据参数的情况下。
3、Intent数据传递
应用场景:传递数据,RP计算器。
Bundle:数据捆,打包传输
[1]方式一:
第一个页面
Intent inent = new Intent();
intent.setClass(this,secondActivity.class);
Bundle bundle = new Bundle(); //打包发送
bundle.putString("name",name);
intent.putExtra("maps",bundle);
startActivity(intent);
第二个页面
TextView tv = new TextView(this);
Intent intent = this.getIntent();
Bundle bundle = intent.getBundleExtra("maps"); //获取打包数据bundle
String name = bundle.getString("name‘); //取出需要的数据
tv.setText(name);
setContentView(tv);
[2]方式二:
创建对象类(javabean)Person
实现Serializable接口
private static final long serialVersionUID = 1L;
第一个页面
Intent inent = new Intent();
intent.setClass(this,secondActivity.class);
Person person = new Person(name); //序列化对象传递
intent.putExtra("person‘,person);
startActivity(intent);
第二个页面
TextView tv = new TextView(this);
Intent intent = this.getIntent();
Person p = (Person)intent.getSerializableExtra("person‘);
String name = p.getName();
4、Intent返回数据
[1]提供返回值的Activity:
将startActivity(intent); 改为 startActivityForResult(intent,1000); //1000为请求码。理解为标识
实现onActivityResult方法
if(requestCode == 1000 && resultCode == Activity.RESULT_OK)
{
String rpText = data.getStringExtra("rpText");
Toast.makeText(this,rpText,1).show();
}
[2]接收数据的Activity:
实现onBackPressed方法 //返回键点击事件
去掉继承父类方法,因为继承后点击返回键将直接返回
Intent data = http://www.mamicode.com/new Intent();
data.putExtra("rpText",text);
setResult(Activity.RESULT_OK,data); //将返回码改为0
this.finish(); //即返回事件
5、横竖屏切换Activity的生命周期
默认情况下会重新加载activity,容易重新加载数据,造成数据丢失。如游戏。
具体流程:onPause -> onStop ->onDestory -> onCreate ->onStart ->onResume
避免横竖屏切换重新创建activity 在清单文件的activity节点中加入:android:configChanges="orientation|keyboardHidden "
6、任务栈
为了提高用户体验 一个应用程序包含多个activity 栈的顶部的activity会在界面中显示,获取焦点。
任务栈的特点:先进后出,后进先出。
7、AndroidManifest中的activity组件
AndroidManifest文件中含有如下过滤器的activity组件为默认启动组件,应用程序启动时,系统自动调用它。
Android 四大组件之 Activity