一---Android-SDK系列文章(4) ---android四大组件之Activity

refer:http://www.cnblogs.com/SharkBin/archive/2013/07/06/3175297.html


一、android 四大组件概览


Android的四大组件:Activity、Service、BroadcastReceiver、Content Provider。


① Activity是Android应用中负责与用户交互的组件——大致上把它想象成Swing编程中的JFrame控件。不过它与JFrame的区别在于:JFrame本身可以设置布局管理器,不断地向JFrame中添加组件,但Activity只能通过setContentView(View)来显示指定组件

Activity为Android应用提供里可视化用户界面,如果该Android应用需要多个用户界面,那么这个Android应用将会包含多个Activity,多个Activity组成Activity栈。当前活动的Activity位于栈顶。

 

View组件是所有UI控件、容器控件的基类,View组件就是Android应用中用户实实在在看到的部分。但View组件需要放到容器组件中,或者使用Activity将它显示出来。如果需要通过某个Activity把指定View显示出来,调用Activity的setContentView()方法即可。

 

② Service与Activity的地位是并列的,它也代表一个单独的Android组件。Service与Activity的区别在于:Service通常位于后台运行它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。一个Service组件被运行起来之后,它将拥有自己独立的生命周期,Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态

 

③ BroadcastReceiver是Android应用中另一个重要的组件,BroadcastReceiver代表广播消息接收器。从代码实现角度来看,BroadcastReceiver非常类似于事件编程中的监听器。与普通事件监听器不同的是:普通事件监听器监听的事件源是程序中的对象;而BroadcastReceiver监听的事件源Android应用中的其他组件。使用BroadcastReceiver组件接收广播消息比较简单,开发者只要实现自己的BroadcastReceiver子类,并重写onReceive(Context context,Intent intent)方法即可。当其他组件通过sendBroadcast()、sendStickyBroadcst()或sendOrderedBroadcast()方法发送广播时,如该BroadcastReceiver也对该消息“感兴趣”(通过IntentFilter配置),BroadcastReceiver的onReceive(Context context,Intent intent)方法将会被触发。   开发者实现里自己的BroadcastReceiver之后,通常有两种方式来注册这个系统级的“事件监听器”。

-->在Java代码中通过Context.registReceiver()方法注册BroadcastReceiver。

-->在AndroidManifest.xml文件中使用元素完成注册。

 

④ ContentProvider 对于Android应用而言,组件必须相互独立,如果这些Android应用之间需要实现实时的数据交换。例如我们开发里一个发送短信的程序,当发送短信时需要从联系人管理应用中读取指定联系人的数据----这就需要多个应用程序之间进行实时的数据交换。

    Content Provider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。

    Android系统为这种跨应用的数据交换提供里一个标准,ContentProvider。当用户实现自己的ContentProvider时,需要实现如下抽象方法。

Insert(Uri, ContentValues):向ContentProvider插入数据。

Deleter(Uri,ContentValues):删除ContentProvdier中指定数据。

Update(Uri, ContentValues, String, String[] ):更新ContentProvider中指定数据。

Query(Uri, String[], String, String[], String):从ContentProvider查询数据。

通常与ContentProvider结合使用的是ContentResolver,一个应用程序使用ContentProvider暴露自己的数据,而另一个应用程序则通过ContentResoler来访问数据。

Intent和IntentFilter  严格的说,Intent并不是Android的组件,但它对于Android应用的作用非常大----它是Android应用内不同组件之间通信的载体。当Android运行时需要连接不同的组件时,通常就需要借助于Intent来实现。Intent可以启动应用中另一个Activity,Service,BroadcastReceiver。


二、android 四大组件之Activity

1. 从apk谈到activity?

        Android的核心不是Application而是Activity,至少在我们开发的时候是这样的;Activity就是被用来进行与用户交互和用来与android内部特性交互的组件。在应用程序中用到的所有activity都需要在manifest.xml文件中进行注册;



2. activity基础?

       Activity代表了用于界面的一屏。一个Activity需要继承Activity类。对于开发者而言,需要派生一个Activity的子类,进而进行编码实现各种功能方法。



       Activity为Android应用提供里可视化用户界面,如果该Android应用需要多个用户界面,那么这个Android应用将会包含多个Activity,多个Activity组成Activity栈。当前活动的Activity位于栈顶。

       从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。

       从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑




       应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

       典型的动作类型有:MAIN(activity的门户)、VIEW(显示)、PICK、EDIT 等。而动作对应的数据则以URI 的形式进行表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW 的intent,以及一个表示这个人的URI。

(Activity主要是控制部分;View主要负责显示界面)



       Activity之间通过Intent进行通信。在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。



      


3.启动Activity??

       通过意图(Intent)来启动一个Activity;

1)  显示启动:一般用于自己调用自己的情况(在当前应用找),这样的启动比较快速,创建Intent后指定包名和类名;

       Intent intent = new Intent(this, OtherActivity.class);

       startActivity(intent);             // 启动新的Activity

       或者:

       Intent intent = new Intent();

       intent.setClassName("com.itheima.activity", "com.itheima.activity.OtherActivity"); // 包名、全类名

       startActivity(intent);             // 启动新的Activity

2)隐式启动:一般用于调用别人的Activity,创建Intent后指定动作和数据以及类型;

       // 电话

       Intent intent = new Intent();

       intent.setAction(Intent.ACTION_CALL);                                        // 设置动作

       intent.setData(Uri.parse("tel://123456"));                                 // 设置数据

       // 网页

       intent.setAction(Intent.ACTION_VIEW);

       intent.setData(Uri.parse("http://192.168.1.45:8080/androidWeb"));

       // 音频/视频,设置type

       intent.setAction(Intent.ACTION_VIEW);

       intent.setDataAndType(Uri.parse("file:///mnt/sdcard/daqin.mp3"), "audio/*");  // 设置数据和数据类型,将启动音频播放器(vedio)


3)为隐式启动配置意图过滤器:

n  显式意图是指在创建意图时指定了组件,而隐式意图则不指定组件,通过动作、类型、数据匹配对应的组件;

n  在清单文件中定义时需要定义才能被隐式意图启动;

中至少配置一个和一个,否则无法被启动;

n  Intent对象中设置的action、category、data在必须全部包含Activity才能启动;

中的都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动;

n  如果一个意图可以匹配多个Activity,Android系统会提示选择;

        

       

            android:name="com.itheima.activity.OtherActivity"

            android:label="OtherActivity" >

           

           

                         

                                                                                          

                

           

           

            

                                 

                                                                                                

               

           

           

           

                                  

                                                                                            

                               

                                                                        

           

    



4、启动时传递数据??:可通过意图Intent对象实现Activity之间的数据传递;

        使用Intent.putExtra()方法装入一些数据, 被启动的Activity可在 onCreate方法中getIntent()获取;

可传输的数据类型: a.基本数据类型(数组),  b. String(数组),  c. Bundle(Map),   d. Serializable(Bean), e.Parcelable(放在内存一个共享空间里);

基本类型:

       Intent intent = new Intent(this, OtherActivity.class);

       intent.putExtra("name", "张飞");         // 携带数据

       intent.putExtra("age", 12);

       startActivity(intent);

一捆数据:

       Intent intent = new Intent(this, OtherActivity.class);

       Bundle b1 = new Bundle();

       b1.putString("name", "赵云");

       b1.putInt("age", 25);

       Bundle b2 = new Bundle();

       b2.putString("name", "关羽");

       b2.putInt("age", 44);

       intent.putExtra("b1", b1);

       intent.putExtra("b2", b2);

序列化对象(须实现序列化接口):

       Intent intent = new Intent(this, OtherActivity.class);

       Person p = new Person("张辽", 44);

       intent.putExtra("p", p);

接收数据:

       在OtherActivity 的onCreate()方法,通过 getIntent().get 相关的数据的方法来获取数据;

 

5、关闭时返回数据

基本流程:

l 使用startActivityForResult(Intent intent, int requestCode) 方法打开Activity;

l 重写onActivityResult(int requestCode, int resultCode, Intent data) 方法;

l 新Activity中调用setResult(int resultCode, Intent data) 设置返回数据之后,关闭Activity就会调用上面的onActivityResult方法;

注意:新的Activity的启动模式不能设置成 singleTask(如果已创建,会使用以前创建的)与singleInstance(单例,单独的任务栈),

         不能被摧毁(执行不到finish方法),父Activity中的 onActivityResult方法将不会执行;

finish():表示关闭当前Activity,会调用onDestroy方法;

Activity_A:

       public void openActivityB(View v) {

              Intent intent = new Intent(this, Activity_B.class);

              Person p = new Person("张辽", 44);

              intent.putExtra("p", p);

              startActivityForResult(intent, 100);                                         // 此方法,启动新的Activity,等待返回结果, 结果一旦返回,自动执行onActivityResult()方法

       }

       protected void onActivityResult(int requestCode, int resultCode, Intent data) {

              if(data == null) {                                                           // 没有数据,不执行

                     return;

              }

              System.out.println(requestCode + ", " + resultCode);         // code 可用来区分,哪里返回的数据

              String name = data.getStringExtra("name");

              int age = data.getIntExtra("age", -1);

       }

Activity_B:

       public void close(View v) {

              // == 关闭当前Activity时,设置返回的数据 ==

              Intent intent = new Intent();

              intent.putExtra("name", "典韦");

              intent.putExtra("age", 55);

              setResult(200, intent);   

              finish();                        // 关闭,类似于点击了后退

       }

 

6、生命周期???

1)Acitivity三种状态

a.       运行:activity在最前端运行;

b.       停止:activity不可见,完全被覆盖;

c.       暂停:activity可见,但前端还有其他activity<>,注意:在当前Activitiiy弹出的对话框是Activity的一部分,弹出时,不会执行onPause方法;

2)生命周期相关的方法(都是系统自动调用,都以 on 开头):

a.         onCreate:      创建时调用,或者程序在暂停、停止状态下被杀死之后重新打开时也会调用;

b.         onStart:                   onCreate之后或者从停止状态恢复时调用;                                                              

c.         onResume:   onStart之后或者从暂停状态恢复时调用,从停止状态恢复时由于调用onStart,也会调用onResume(界面获得焦点);

d.         onPause:       进入暂停、停止状态,或者销毁时会调用(界面失去焦点);

e.         onStop:          进入停止状态,或者销毁时会调用;

f.          onDestroy:    销毁时调用;

g.         onRestart:    从停止状态恢复时调用;

3)生命周期图解:

        应用启动时,执行onCreate onStart onResume,退出时执行:onPause onStop onDestroy;

        Activity的生命周期很重要,Activity主要包含六个方法,分别是onCreate,onStart,onResume,

onPause,onStop,onDestory。

        onCreate和onDestory对应。onStart和onStop对应,onResume和onPause对应。

        这几个函数大概是这样定义的,当启动一个Android Activity类的时候,onCreate方法首先会被启动,然后接着是onStart和onResume,也会启动,一般地,等这几个函数都启动完了之后你这个Activity就可以被显示出来了。当然我这里说的是一般的情况,如果你要是在这三个函数初始化的时候启动了一个后台的Service,那么还要等待ServiceConnection执行完毕才能够被显示出来,这里可能有人要问什么是Service了,在以后我会介绍它,这里大家就先了解下Service的回调函数也会影响Acitivity的启动就可以了。









你可能感兴趣的:(一---Android-SDK系列文章(4) ---android四大组件之Activity)