四大组件之Activity
Activity组件在application中的主要作用就是和用户交互,下面我们而来详细地了解一下Activity.
(一)Activity的创建
创建一个Activity需要一下几个步骤:
创建一个类,继承Activity。复写里面的的Oncreate()方法;
public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); } }
创建一个XML布局文件,在Oncreate()方法中加载布局文件;
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我的第一个activity"/> </LinearLayout>
在清单文件中注册Activity
<activity android:name="com.example.activitytest_1.FirstActivity"> </activity>
这样,一个Activity就算创建完成了。当然,这些事最最基本的。下面我们来了解一下Activity之间的数据传输。
(二)Activity之间的数据传输
Activity之间的数据传输是通过Intent对象来实现的。数据传输分为显式Intent和隐式Intent.
隐式Intent:
通过一组动作和数据来匹配一个Activity。
一般用于调用别人的Activity.实例代码:以打电话为例
Intent intent =new Intent(); Intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parser("tel:123456")); startActivity(intent);
这里我们需要注意的是:
我们设置action和data时,要匹配我们要跳转的Activity的intent-filter里面的action和data里面的内容,不然无法跳转。
显式Intent:
可以直接通过包名和类名打开Activity,不需要配置intent-filter.
一般用于打开自己的application。示例代码:
Intent intent =new Intent(); intent.setClass(this,FirstActivity.class); startActivity(intent);
当我们跳转到第二个Activity之后,需要从第二个Activity里面回传数据时,这是我们就需要以不同的方式来start方式我们的Activity了。这个过程也是三步:
在第一个Activity里面,我们跳转Activity用方法startActivityForResult()来启动Activity。
startActivityForResult(intent,requestCode);
我们还需要同时复写方法onActivityResult(resquestCode,resultCode,intent)
- 这个方法的作用是在其他Activity回传数据之后会自动调用这个方法。
- 我们可以根据respondCode 或requestCode来获取intent传过来的数据。建议用respondCode,不会出现空指针异常。
protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(resultCode == 11){ //设置组件的文字 et.setText(data.getStringExtra("number"));//从intent中获取到数据 } if(resultCode ==22){ msg.setText(data.getStringExtra("msg")); }
}
在跳转之后的页面里面我们需要设置要回传的数据
//设置返回的值 setResult(11, intent); //关闭Activity finish();
这样我们就可以实现数据回传的功能了。
(三)Activity的生命周期
Activity生命周期,主要是讲的Activity的从生到死的过程。Activity里面有7个方法和生命周期有关。
public class ExampleActivity extends Activity {
@Override
//Activity被创建的时候调用此方法。
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
//Activity即将能被看见的时候调用这次方法
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
}
@Override
//Activity能被看见的之后调用这次方法
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
@Override
//其他Activity获取到焦点的时候调用此方法
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
//Activity将不可见的时候调用此方法
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
}
@Override
//Activity在onPause或者onStop状态重新可见的时候调用此方法
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
}
@Override
//Activity将被销毁的时候调用此方法
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
> 这里值得一提的是,当我们没有做任何设置的时候,手机在横屏竖屏之间相互切换的时候,Activity是先destroy然后create。
要求横竖屏切换activity不杀死 只是做界面的改变,我们可以配置configChanges
<activity
android:name=".FirstActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
>
</activity>
但是开发中如果需要没有明确要求,直接把activity屏幕的方向定死。
<activity
android:name="cn.itcast.sendmessagetest.ContactActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
>
</activity>
(四)Activity的四种启动模式
活动栈:
用来记录用户的操作行为。任务栈里面放置的都是Activity的引用。
Android中维护的任务栈,自增的,都会加1, 当手机重启的时候就会清零,维护的Activity的最大值为Int的最大值。
当启动一个应用程序,系统就会分配一个任务栈给应用。
四种启动模式:
standard 标准 (默认)
特点:当你通过startActivity() 启动的activity的实例的引用就会放置在任务栈
每次启动都会创建一个新的实例singleTop独占顶端
如果activity已经在栈顶,那么不会创建新的实例,而会复用栈顶的Activity.
如果不再栈顶,创建新的实例singleTask 单任务栈
特点:如果任务栈里面出现了activity,那么就会清空该activity上面所有的activity,再重用该Activity
singleInstance 单实例
特点:如果activity的启动模式设置了singleInstance 这样的activity会单独存放在一个任务栈里面。并且这样的实例只会有一份引用。