好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件。首先,接触android的人,都应该知道android中有四大组件,activity,service,broadcast receiver,content provider,简单的翻译就是页面,服务,广播,和内容提供者。
activity:activity指的是app中的每一个页面,他是整个项目最基本的组成部分,一个项目就是有很多很多个activity组成的,activity显示的内容可以分为两种声明方式,第一种是通过XML配置文件来声明,第二中就是继承view的对象。
1.通过XML文件来配置,我们在项目中没创建一个activity,如果使用android studio来开发的话,系统会自己帮在配置文件中配置好,使用eclipse的话,则需要手动进行配置。
2.继承字view来声明:这种声明模式我们一般是自定义的时候我们用的比较多,这种灵活性比较好,复用性比较强耦合性比较强。
说到activity,那必须得谈一谈activity的生命周期了,activity的生命周期有以下的这些(手打出来的,大小写不要在意)oncreate(),onstart(),onresume(),onpause(),onstop(),onrestart(),ondestroy() .
这七个方法就包含了整个页面从开始创建到销毁。当页面开始创建出来的时候,系统会掉用oncreate()这个方法,接着就会掉用onstart()方法,这个时候我们是看不到这个页面的,当我们看到这个页面的时候,也可以说页面获得焦点的时候,就会掉用onresume(),当页面可见,但是失去焦点的时候,系统就会掉用的是onpause(),什么是失去焦点?举个例子,页面中弹出一个对话框,我们可以看到这个页面,但是我们不能对这个页面进行操作,这个时候就是说页面失去了焦点。onstop()这个方法,翻译过来就是停止,当一个页面被另一个页面覆盖的时候,就是看不到这个页面的时候,这个页面就会掉用onstop(),这个方法,那什么时候会掉用ondestroy()这个方法呢,当我们手动进行销毁这个页面的时候,比如我们掉用finish()方法的时候,系统就会掉用ondestroy()方法,但是,这不是绝对的,很多时候系统也会掉用ondestroy()方法,比如犹豫我们代码出现问题,内存溢出啊,或者是内存泄漏啊什么的,导致程序崩溃,也会掉用ondestroy()方法。
service:android四大组件之一的service,服务是在后台上运行的,所以并没有一个可视化的界面,所以当应用程序需要进行某种不需要前台显示的计算或者数据处理时,就可以使用这个service。service一般由activity或者其他对象来进行启动的,当启动service之后,即便启动他的组件的生命周期已经结束,但是该service仍然继续运行,知道自己的生命周期结束。
当然service不同的启动方式,他的生命周期也是不同的。
1:通过startservice方式启动,当系统调用startservice方法时,如果该service还未启动,则会掉用其oncreate()方法和on start()方法.当其他的context对象调用stopservice()方法或者是service本身掉用自身的stopSelf或者stopservice()方法时才会停止。
2:通过bindService方法启动服务,当系统调用bindService方法时,如果该service还未启动,则会调用其oncreate方法,然后会将service和context对象进行绑定,当组件销毁的时候,service也会跟着销毁。
broadcast Receiver组件:
broadcast Receiver——广播,广播有两种注册方式,一种是静态注册,另一种是动态注册;
静态注册:这种注册方式可以使得应用程序安装之后,Broadcast Receiver始终处于活动的状态,通常用于监听系统状态的改变,比如说电量不足,网络状况,Wi-Fi情况等等。这种注册方式我们主要是在在AndroidManifest.xml中注册,比如:
<receiver android:name=".MyReceiver">
<intent-filter >
<action android:name="myaction"/>
</intent-filter>
</receiver>
动态注册:这种注册方式就灵活的多了,这中注册方式直接就在activity中进行注册,通常来说这样注册的Broadcast Receiver通常是用于更新ui的状态,一般来说,都是一个activity在启动的时候使用这样的方法注册Broadcast Receiver,一旦接受到了广播的事件,就可以在onReceiver方法中更新当前的这个控件,但是需要注意到的是如果这个activity不可见了,就应该unregisterReceiver方法来解除注册;
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("myaction");
registerReceiver(receiver, filter);
Content Provider组件:
Content Provider组件主要用于不同应用程序之间进行数据共享。
下面说一说应用程序的内部通信
内部程序通信是简单来讲是指线程和自己开发的子线程之间的通信,在android应用程序运行时,默认情况下会成为第一个启动的组件创建一个进程,之后启动的组件都运行在这个进程中。
通常,主线程和子线程之间的通信,我们用的最多的就是handler,应用程序在主线程中维护一个消息队列,handler机制使得线程间的通信通过message和Runnable对象来传递和处理。
(1)传递消息对象
使用handler传递消息时将消息封装到一个message对象中,message类中包涵了消息的描述和任何形式的可以被handler发送的数据对象,通常,一个message对象中的字段有下面的子段:
Arg1 | Int类型,当传递的消息只包含整数时,可以填充该字段以降低成本,该字段可以通过成员方法setData和getData方法访问或修改 |
arg2
obj object类型
what int 类型,有用户定义的消息类型码,接收方根据该字段来判断消息。
方法名 | 说明 |
sendEmptyMessage(int what) | 发送一个空消息 |
sendMessage(Message message) | 发送一个消息对象 |
sendMessageAtTime(Message me,long time) | 在指定时间之前发送 |
sendMessageDelayed(Message me.long time) | 在指定时间间隔之后发送 |
敲了着么久,好累,先休息会,下次再更。