四大组件之Activity

四大组件之Activity

Activity组件在application中的主要作用就是和用户交互,下面我们而来详细地了解一下Activity.

(一)Activity的创建

创建一个Activity需要一下几个步骤:

  1. 创建一个类,继承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);
        }
    }
    
  2. 创建一个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>  
    
  3. 在清单文件中注册Activity

    <activity android:name="com.example.activitytest_1.FirstActivity">
    </activity>    
    

这样,一个Activity就算创建完成了。当然,这些事最最基本的。下面我们来了解一下Activity之间的数据传输。

(二)Activity之间的数据传输

Activity之间的数据传输是通过Intent对象来实现的。数据传输分为显式Intent和隐式Intent.

  1. 隐式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里面的内容,不然无法跳转。

  2. 显式Intent:

    可以直接通过包名和类名打开Activity,不需要配置intent-filter.
    一般用于打开自己的application。

    示例代码:

    Intent intent =new Intent();
    intent.setClass(this,FirstActivity.class);
    startActivity(intent);
    

当我们跳转到第二个Activity之后,需要从第二个Activity里面回传数据时,这是我们就需要以不同的方式来start方式我们的Activity了。这个过程也是三步:

  1. 在第一个Activity里面,我们跳转Activity用方法startActivityForResult()来启动Activity。

    startActivityForResult(intent,requestCode);  
    
  2. 我们还需要同时复写方法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"));
        }
    

    }

  3. 在跳转之后的页面里面我们需要设置要回传的数据

    //设置返回的值
    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的最大值。
当启动一个应用程序,系统就会分配一个任务栈给应用。

四种启动模式:
  1. standard 标准 (默认)

    特点:当你通过startActivity() 启动的activity的实例的引用就会放置在任务栈
    每次启动都会创建一个新的实例

  2. singleTop独占顶端

    如果activity已经在栈顶,那么不会创建新的实例,而会复用栈顶的Activity.
    如果不再栈顶,创建新的实例

  3. singleTask 单任务栈

    特点:如果任务栈里面出现了activity,那么就会清空该activity上面所有的activity,再重用该Activity

  4. singleInstance 单实例

    特点:如果activity的启动模式设置了singleInstance 这样的activity会单独存放在一个任务栈里面。并且这样的实例只会有一份引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值