Android基础学习之Activity

简介


    Activity在应用中负责与用户进行交互的组件,为用户提供了可视化的界面。一个App必定是由多个Activity组成的,不客气的说,Activity是四大组件中使用最频繁的组件,没有之一。对于Activity,准确的说,应该把它理解为一个容器,我们能看到的一切东西如按钮,复选框,编辑框等,必须放在Activity里面使用setContentView方法方可显示。

生命周期


Activity的生命周期可以分为七个阶段 如图(来源百度):


这里写图片描述


从图中我们可以看出,Activity的生命周期中,以下的方法会被系统回调。(摘自疯狂Android讲义)

  • ①onCreate(Bundle savedInstanceStatus): 创建Activity时被回调,但只会被回调一次

  • ②onStart(): 启动Activity时被回调。

  • ③onRestart(): 重新启动Activity时被回调

  • ④onResume():恢复Activity时被回调, onStart()方法后一定会回调Resume()

  • ⑤onPause(): Activity暂停时回调

  • ⑦onDestroy(): 销毁时被回调,同理,该方法也只会回调一次,一旦销毁,将会释放该Activity的所有资源。

Activity加载模式


Activity的加载模式有四种,分别是:standard标准模式(如果不设置将默认使用),singleTop(Task顶单列模式),singleTask(Task内单列模式),以及singleInstance(全局单例模式)
Android通过Task管理Activity的,Task可理解为栈,栈是一种典型的先入后出的数据机构。

  • standard标准模式:每一个Activity都可以启动本身的Activity。

  • singleTop模式:当Activity位于栈顶时,系统不会创造新的Activity

  • singleTask模式:该模式分三种情况① 当要启动的Activity不存在时,系统将会创建目标Activity,同时将它放在栈顶 ② 如果该Activity已经位于栈顶时,那么和singleTop模式一样。 ③ 如果启动的Activity没有位于栈顶,那么将会将Activity上面的所有的Activity移出Task栈,使该Activity位于栈顶

  • singleInstance模式:该模式只会创建一个Activity实例,类似于单列模式,分为两种情况,①如果启动的Activity还没有创建,那么将会创建一个Task,同时创建一个Activity,并且将它放入栈顶 ② 如果启动的Activity已经存在,那么,系统会将该Task移动到前台,从而使该Activity显示出来。

Activity传递数据


   不同的Activity之间需要传递数据,页面之间的跳转,可以通过页面之间的意图(Intent)来实现。但是只有Intent还是不行,我们还需要包裹Bundle,因为Intent就只是相当于一个邮差,邮差只有包裹怎么传递信息啊,包裹才是信息啊


这里写图片描述


   在平时的使用中,直接使用Bundle的时间不多,因为Intent把Bundle做了有效的封装,我们可以直接使用 new Intent(String key, XXX value)减少代码的书写, 跳转页面后,我们就可以使用getXxx(String key)得到传递过来的数据。

Bundle方法

方法说明
putXxx(String key,Xxx date)向Bundle放入数据,支持Int,Long,boolean
putSerializable(String key,Serializable date)向Bundle中加入一个可序列化的对象
Xxx getXxx(String key)从Bundle中取出Xxx类型的数据
Xxx getSerializable(String key, Serializable date)向Bundle取出一个可序列化的对象

代码示例

Bundle bundle = new Bundle();
bundle.putChar("key", 'd');
bundle.putBoolean("key", true);
bundle.putCharArray("key", d);

直接使用Bundle

方法说明
putExtras(Bundle date)向Intent中加入需要携带的数据包
Bundle getExtras()从Bundle中取出数据包

代码示例

 Intent intent = new Intent();
 Bundle bundle = new Bundle();
 bundle.putChar("key", 'd');
 bundle.putBoolean("key1", true);
 intent.putExtras(bundle);

间接使用Bundle

方法说明
putExtras(String key, Xxx value)向Intent中加入需要携带的Xxx类型数据包
Xxx getExtras(String key)从Intent中取出Xxx数据包

代码示例

 Intent intent = new Intent();
 intent.putExtra("key1", "haha");
 intent.putExtra("key2", true);
 intent.putExtra("key3", 123);

温馨提示:如果多个Activity需要共享数据,比如有三个Activity页面A,B,C,打开顺序是A→B→C, 如果将A页面产生的数据发送给C的话,就不应该采用Intent依次传递数据,建议使用重写Application共享数据。

使用Activity注意事项


使用Activity需要在AndroidManifest.xml中显示配置,不仅仅是Activity,其它三大控件同样需要显示配置(Service, ContentProvider,BroadcastReceiver)。

代码示例

<activity
      android:name=".MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
</activity>


由于Actiivty运行在主线程(UI线程),因此不能执行一些耗时的操作,比如操纵数据库,网络请求等,否者可能引发ANR异常,解决方法是采取异步或者在Activity中单独开一个线程执行耗时的任务。

Activity的startActivityForResult()


    之前一直没有使用该方法,今天,借着写博客把这个方法给研究一下。startActivityForResult()与startActivity()相比,被打开的页面可以向最初的Activity返回信息,而startActivity() 方法是向被打开的Activity传递信息,因此它们两信息传递的方向是相反的。
    首先我们来看下startActivityForResult(Intent intent, int requestCode). intent很简单,只是指定启动那个Activity,主要我们来看一下requestCode,这个参数作用就是判断谁(控件)发出了请求,举个例子:在一个Activity中,有两个按钮,分别可以打开同一个的Activity,当返回到当前的Activity(即包含两个按钮的Activity)时,我们需要知道,究竟是那个按钮打开了指定的Activity。我们就可以根据requestCode判断了。
    通常,使用startActivityForResult()时,我们需要重写onActivityResult(int requestCode, int resultCode, Intent data)

  • requestCode 用来判断请求来自于界面的那个控件。

  • resultCode 用来判断被打开的Activity是否完成了任务,请求码是被打开的Activity发出的,因此也可以判断,返回的信息来自于那个Activity。

    Demo演示


    这里写图片描述

    第一个Acitivity


public class First extends Activity {
    private Button btn;
    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.btn);
        text = (TextView)findViewById(R.id.text);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(First.this, Second.class);
                startActivityForResult(intent,1);

            }
        });
    }
    @SuppressLint("ShowToast") @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent){
        //信息来自第二个Activity且任务完成     PS:requestCode和resultCode的值可以根据业务任意指定
        if(requestCode == 1 && resultCode == 2){
            String msg = intent.getStringExtra("msg");
            text.setText(msg);
            Log.v("dd", msg);

        }
    }

}


第二个Acitivity

public class Second extends Activity {
    private Button second_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        second_btn = (Button) findViewById(R.id.second_btn);
        second_btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                // 将要返回的信息是"Happy New Year!"
                intent.putExtra("msg", "Happy New Year!");
                //设置结果码为2.
                setResult(2, intent);
                finish();

            }
        });
    }
}

总结


    夜已经深了!心里感概万千。路在何方啊!现在学习比较浮躁,也不想看书,更加坑爹是,每天都要出去练车,课时都不够了,也不知道为什么,今天练车状态很不好,老感觉压线了。明明前几天练习的都感觉都没什么问题的了,今天老在倒库哪里出问题,礼拜三就校考了,不希望科二再挂了。
    写博客确实是和自己的惰性在较劲,这篇博客躺在草稿箱好几天了,今天咬牙更了,但是感觉写的不怎么样,将自己平时于Activity的理解写下来,算是总结吧!但是也不全,关于Activity的继承关系也没说。 哎!!!
不说了。。睡觉了。晚安吧!





——————————————————————————————-

欢迎转载,尊重作者劳动成果,转载请务必注明出处
技术因分享而饱含生机

——————————————————————————————-

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值