activity

1. 说明:

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供,BroadcastReceiver广播接收器)之一。Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

2. Activity生命周期

onCreate():在创建Activity是被回调,在这里你应该完成所有常见的静态设置工作——创建view、绑定list数据等等
onRestart():activity被停止后、又再次被启动之前调用(Acitivity没有被系统销毁情况下)。
onStart():启动Activity时被回调
onResume():activity开始与用户交互之前回调。这时activity是在activity栈的顶端,用户可以向其中输入。
onPause():当系统准备启动另一个activity时回调。这个方法通常用于把未保存的改动提交为永久数据、停止动画播放、以及其它可能消耗CPU的工作等等。 它应该非常迅速地完成工作,因为下一个activity在本方法返回前是不会被恢复运行的。如果activity返回前台,则下一个回调方法是onResume();如果进入用户不可见状态,则下一个是onStop()。
onStop():当activity不再对用户可见时回调。原因可能是它即将被销毁、或者其它activity(已有或新建的)被恢复运行并要覆盖本activity。如果activity重新与用户交互,则下一个回调方法是onRestart();如果这个activity即将消失,则下一个回调方法是onDestroy()。
onDestroy():在本activity被销毁前回调。这是activity收到的最后一个调用。 可能是因为activity完成了工作(手动调用finish()), 也可能是因为系统为了腾出空间而临时销毁activity的本实例。 可以利用isFinishing() 方法来区分这两种情况。
这里写图片描述

3. 参数传递

在Activity之间的跳转是有时会将上个Activity中的数据传到下一个Activity中,或者当前Activity退出时数据返回到上一个Activity中。
(1)当前Activity向下一个Activity传递参数:
a、Intent传递一些简单的参数
当前Activity调用putExtra(name, value);存放键值对(key-value)

Intent  intent = new Intent(this,xxxx.class);
        intent.putExtra(name, value);
        startActivity(intent);

在另一个Activity中,获取传递过来的参数

Intent i = getIntent(); 
String value = i.getStringExtra("name");  

b、Bundle 传递数据
当前Activity中将数据放入Bundle中,再使用intent传递(bundle也是存放键值对)

Bundle bundle = new Bundle();  
bundle.putString(name, value);
intent.putExtras(bundle);

另一个activity中接受数据

Intent intent=getIntent();  
        Bundle bundle=intent.getExtras();  
        String value=bundle.getString(name);

注:其中key都是String类型
(2)当前Acitivity将数据返回到上一个Activity:
列:A==>B,B==>A。activityA跳转到activityB,然后从B返回到A,并将B中的数据同时返回到A中
A:
调用startActivityForResult(intent, requestCode);其中requestCode为请求码。
并重写onActivityResult(int requestCode, int resultCode, Intent data);其中resultCode为结果码,data为另一个Activity返回的数据(类似activityB)。

public class MainActivity extends Activity  
{  
    private Button mainBtn=null;  
    private final static int REQUEST_CODE=1;  

    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        mainBtn=(Button)findViewById(R.id.mainBtn);  
        mainBtn.setOnClickListener(listener);  
    }  

    private OnClickListener listener=new OnClickListener()  
    {  
        @Override  
        public void onClick(View v)  
        {  
            Intent intent=new Intent();  
            intent.setClass(MainActivity.this, SecondActivity.class);  
            intent.putExtra("name", "小明");  
            startActivityForResult(intent, REQUEST_CODE);  

        }  

    };  

    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data)  
    {  
        if (requestCode==REQUEST_CODE)  
        {  
            if (resultCode==SecondActivity.RESULT_CODE)  
            {  
                Bundle bundle=data.getExtras();  
                String str=bundle.getString("backA");  
                Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();  
            }  
        }  
    }  


}  

B:
调用setResult(resultCode, data);其中resultCode为结果码,data为intent

public class SecondActivity extends Activity  
{  
    public final static int RESULT_CODE=1;  
    private TextView secondTxt;  
    private Button secondBtn;  

    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.second);  
        Intent intent=getIntent();  
        Bundle bundle=intent.getExtras();  
        String str=bundle.getString("name");  
        secondTxt=(TextView)findViewById(R.id.secondTxt);  
        secondTxt.setText(str);  

        secondBtn=(Button)findViewById(R.id.secondBtn);  
        secondBtn.setOnClickListener(listener);  

    }  

    private OnClickListener listener=new OnClickListener()  
    {  
        @Override  
        public void onClick(View v)  
        {  
            Intent intent=new Intent();  
            intent.putExtra("backA", "Back A");  
            setResult(RESULT_CODE, intent);  
            finish();  
        }  

    };  
}  

注: 这里 要说明的是RESULT_CODE必须与前一个Activity(B中)一致,否则就不能正常返回。而第一个MainActivity通过重写onActivityResult()来取得相应的返回值。

4. onSaveInstanceState

onsaveInsanceState方法是用来保存Activity的状态的。当一个Activity在生命周期结束前,会调用该方法保存状态。这个方法有一个参数名称与onCreate方法参数名称相同。
在实际应用中,当一个Activity结束前,如果需要保存状态,就在onsaveInsanceState中,将状态数据以key-value的形式放入到saveInsanceState中。这样,当一个Activity被创建时,就能从onCreate的参数saveInsanceState中获得状态数据。onSaveInstanceState的调用顺序是在onPause之前。
实际应用中:一个游戏在退出前,保存一下当前游戏运行的状态,当下次开启时能接着上次的继续玩下去。再比如:电子书程序,当一本小说被阅读到第199页后退出了(不管是内存不足还是用户自动关闭程序),当下次打开时,读者可能已忘记了上次已阅读到第几页了,但是,读者想接着上次的读下去。如果采用saveInstallState参数,就很容易解决上述问题。

5. onRestoreInstanceState

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据。onRestoreInstanceState的调用顺序是在onStart之后。

6.启动模式

standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。singleTop即表示当前Activity栈中“栈顶唯一”

singleTask
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前栈中创建一个新的实例,若存在,则会把栈中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个栈,并在该栈中启动这个Activity,singleTask允许别的Activity与其在一个栈中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的栈中。singleTask表示当前Activity栈中“实例唯一”

singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

其中横竖屏切换时候Activity的生命周期可以参考http://blog.csdn.net/jdsjlzx/article/details/6598135

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值