Android基础学习之Activity

简介


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

生命周期


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


Android基础学习之Activity_第1张图片


从图中我们可以看出,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就只是相当于一个邮差,邮差只有包裹怎么传递信息啊,包裹才是信息啊


Android基础学习之Activity_第2张图片


   在平时的使用中,直接使用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演示


    Android基础学习之Activity_第3张图片

    第一个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的继承关系也没说。 哎!!!
不说了。。睡觉了。晚安吧!





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

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

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

你可能感兴趣的:(Android基础学习——其它,android)