标签:
Android的另外两大组件:BroadcastReceiver和Service。
一、BroadcastReceiver广播接收者,广播是Android中传递事件的方式,有两个方面:广播发送者和广播接收者。
1、广播发送者可以发送两种广播:同步广播和有序广播,两者的区别是
①接收顺序的区别:同步广播同步接收,有序广播可以通过指定优先级来设置接收顺序
②是否可以中断的区别:由于有序广播有顺序,才有可能将广播进行中断,不让后来者进行接收;而同步广播则不能中断。
2、广播接收者:广播发送的具体内容就是一个隐式意图对象(因为通常是给另外的应用使用的),接收者通过两步来实现
①在清单文件中进行配置,
②继承BroadcastReceiver对象,并重写onReceive方法,在其中实现功能即可。
有序广播通过指定优先级来确定接收顺序,优先级从-1000~1000,
①如果同一个应用中的优先级相同,则在清单文件中前面的先接收
②如果不同应用中的优先级相同,则先安装的应用先接收
参考:http://blog.csdn.net/xiazdong/article/details/7768807,
二、Service,服务是没有界面而在后台长期运行的程序。
1、在Android中按返回键退出一个应用并不会(内存充足时)直接销毁一个进程,所以其中的子线程也可以在后台运行,这种线程和服务的区别是优先级不同,如果内存不足,被销毁的顺序不同。而且即使服务所在进程被销毁,如果内存充足会自动重新运行。有关Android进程内容参考:http://mobile.51cto.com/aprogram-459724.htm。
作为Android四大组件之一,Service只要继承Service类,并在清单文件中配置即可使用。
2、有两种方式开启Service,①使用startService();②使用bindService()。两者的区别在于
①前者创建一个服务之后,就与这个服务没有关联了,因为没有方法可以在获取这个服务的实例了。但是进行联系还需要复杂的操作,并且还要区分进程内绑定本地服务和进程外绑定远程服务
②通过绑定开启的service,一旦调用这个服务的activity被销毁则这个服务也被销毁。即服务不能长期存在。
1 import android.app.Activity; 2 import android.content.ComponentName; 3 import android.content.Intent; 4 import android.content.ServiceConnection; 5 import android.os.Bundle; 6 import android.os.IBinder; 7 import android.view.View; 8 9 public class MainActivity extends Activity { 10 private MyConn conn ; 11 private IMiddlePerson mp; 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 } 18 19 @Override 20 protected void onDestroy() { 21 System.out.println("啊啊啊,我是activity,我挂了"); 22 super.onDestroy(); 23 } 24 25 //绑定服务 26 public void bind(View view){ 27 //3.activity采用绑定的方式去开启服务。 28 //激活一个服务的意图 29 Intent intent = new Intent(this,MyService.class); 30 //保持联系的连接对象 31 conn = new MyConn(); 32 bindService(intent, conn, BIND_AUTO_CREATE); 33 34 } 35 //解除绑定服务 36 public void unbind(View view){ 37 unbindService(conn); 38 } 39 40 private class MyConn implements ServiceConnection{ 41 //4. 当服务被连接的时候调用,服务被成功绑定的时候调用。IBinder就是绑定的Service的onBind()的返回值, 42 //!!!这就是联系所在 43 @Override 44 public void onServiceConnected(ComponentName name, IBinder service) { 45 System.out.println("在activity里面成功得到了中间人"); 46 mp = (IMiddlePerson) service; 47 } 48 //当服务失去连接的时候调用(一般进程挂了,服务被异常杀死) 49 @Override 50 public void onServiceDisconnected(ComponentName name) { 51 52 } 53 } 54 55 //调用服务里面的方法。 56 public void call(View view){ 57 //5.通过中间人调用服务里面的方法。 58 mp.callMethodInService(55); 59 } 60 }
1 import android.app.Service; 2 import android.content.Intent; 3 import android.os.Binder; 4 import android.os.IBinder; 5 import android.widget.Toast; 6 7 public class MyService extends Service { 8 9 //2.实现服务成功绑定的代码 ,返回一个中间人(一个符合IBinder要求的类,这里就是下面的内部类)。 10 @Override 11 public IBinder onBind(Intent arg0) { 12 System.out.println("服务被成功绑定了。。。。"); 13 return new MiddlePerson(); 14 } 15 16 @Override 17 public boolean onUnbind(Intent intent) { 18 System.out.println("onunbind"); 19 return super.onUnbind(intent); 20 } 21 22 @Override 23 public void onCreate() { 24 System.out.println("oncreate"); 25 super.onCreate(); 26 } 27 28 @Override 29 public int onStartCommand(Intent intent, int flags, int startId) { 30 System.out.println("onstartcommand"); 31 return super.onStartCommand(intent, flags, startId); 32 } 33 34 @Override 35 public void onDestroy() { 36 System.out.println("ondestory"); 37 super.onDestroy(); 38 } 39 40 /** 41 * 这是服务里面的一个方法 42 */ 43 public void methodInService(){ 44 Toast.makeText(this, "哈哈,服务给你办好了暂住证。", 0).show(); 45 } 46 47 //1.第一步服务要暴露方法 必须要有一个中间人 48 private class MiddlePerson extends Binder implements IMiddlePerson{ 49 /** 50 * 代办暂住证 51 * @param money 给钱 50块钱以上才给办。 52 */ 53 public void callMethodInService(int money){ 54 if(money>=50){ 55 methodInService(); 56 }else{ 57 Toast.makeText(getApplicationContext(), "多准备点钱。", 0).show(); 58 } 59 } 60 /** 61 * 陪领导打麻将 62 */ 63 public void playMajiang(){ 64 System.out.println("陪领导打麻将。"); 65 } 66 } 67 }
注意:上面的service方的中间人内部类是私有的,所以向外传递时不能直接将其抛出,所以在这里使用了一个接口作为中转,将需要暴露的方法通过接口暴露。
参考:http://blog.csdn.net/ryantang03/article/details/7770939。
3、除了可以绑定(这里强调绑定是指有数据共享的情况,如果仅仅是激活一个服务则不需要)自己写的服务(同一个进程中),还可以绑定系统/他人写的service。这就涉及到进程间通讯,在Android中的使用的是Binder方式实现的,而且提供了一个AIDL的轻量级实现方法。使用过程和上面类似,区别有2点:
①service方:对外暴露方法使用AIDL(Android接口定义语言)而不是java中的接口,区别是没有修饰符,eclipse可以自动生成一个可用于进程间通讯的接口类(在/gen目录下)
②调用方:在调用方的应用中也需要以同样的方式创建AIDL文件,然后通过 类名.Stub.asInterface(service) 来获取中间对象。
4、混合调用服务:即同时使用绑定和start方式调用服务。这是为了解决两种方式的缺点(start方式不能通信,绑定方式不能长期存在)
三、Intent:可以理解为一种请求或意愿,可以用来激活Activity,Service和Broadcast Receiver,相应组件只要在配置中添加intent-filter即可获取指定意图。
意图分两种:显示意图,隐式意图。区别在于前者通过构造函数的参数指定了具体的接收者,使用意图过滤器过滤的就是隐式意图,显示意图通常用于激活自己的组件,而隐式意图通常用于激活他人的/系统的组件。
一个Intent可以设置动作(Action),数据(Data-->uri),类型(Type-->MIME),分类(Category),附加信息(Extras),而通过过滤器匹配意图就是需要进行三个匹配,一个是action,一个是category,一个是data,可以是全部或部分匹配。
参考:http://blog.csdn.net/think_soft/article/details/7330095,
http://blog.csdn.net/t12x3456/article/details/7688154,
http://fenglingdangyang.blog.sohu.com/231856618.html,
标签:
原文地址:http://www.cnblogs.com/songfeilong2325/p/4854042.html