Service
1、service的隐式启动和显示启动( 如果在同一个包中。两者都可以用。在不同包时。只能用隐式启动)
隐式启动
<service android:name=".service">
<intent-filer>
<action android:name="com.android.service"/>
<intent-filer>
</service>
final Intent serviceIntent=new Intent();
serviceIntent.setAction("com.android.service");
显示启动
final Intent serviceIntent=new Intent(this,service.class);
startService(serviceIntent);
2、activity对service的调用:startService()和bindService()
两者生命周期的区别
1)startService()方法
这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。 当service被停止时,系统会销毁它。多次调用startService(),只会调用1次onCreate(),但会多次调用onStartCommand()方法。
2)bindService()方法
客户可以通过一个IBinder接口和service进行通信。 客户可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
IBinder对象相当于Service组件中的内部钩子,可以访问Service内部数据,Activity通过IBinder类和Service通信。在实际开发中,通常在Service中定义一个Binder的子类。
bindService(Intent service, ServiceConnection conn, int flags),启动Service。ServiceConnection类,用于监听访问者和Service之间的链接情况。当activity和service链接成功后回调ServiceConnection对象的onServiceConnected方法,可在该方法中获取IBinder对象。
多次调用 bindService(),只会调用1次onCreate()和onBind()方法。
3)IntentService的使用
Service不是一条新线程,不应该在其中处理耗时任务。Service不会启动一个单独的线程,它与所在应用处于同一个进程中。
intentservice是Service的子类,只需要实现onHandleIntent()方法
BroadcastReceiver
BroadcastReceiver是一个系统级的全局监听器,能够实现不同组件之间的通信。在实现BroadcastReceiver时,主要实现其中的onReceiver()方法,但是不能执行耗时操作。
1、使用步奏
1)注册BroadcastReceiver,代码注册或者xml注册
2)创建Intent,用于启动BroadCastReceiver
3)调用指定BroadcastReceiver:Context的sendBroadcast()或者sendOrderedBroadcast
2、注册
1)代码注册(适合将BroadcastReceiver作为内部类使用)
IntentFilter filter=new IntentFilter("android.provider.xxx");//intent过滤器
MyReceiver receiver=new MyReveiver();//Receiver对象
registerReceiver(receiver,filter);//注册//
unregisterReceiver(receiver);//取消注册
2)AndroidManifest.xml注册(适合将BroadcastReceiver单独的类)
<intent-filter>
<action android:name="com.simware.BroadcastReceiverDemo" >
</action>
</intent-filter>
3、普通广播和有序广播
1)普通广播(Normal Broadcast):系统异步发送广播,同一时刻可以被所有接受者受到,效率高,但接受者不能将处理结果传递给下一个接受者。通过Context的sendBroadcast()发送普通广播
2)有序广播(Ordered Broadcast):接受者将按照实现规定的优先级依次接收Broadcast。接收者可以终止Broadcast Intent的传播,低优先级的接收者将不会受到广播。同时接受者可以将数据传递给下一个接受者:setResultExtras(Bundle)来存放数据和getResultExtras(true)来接收上级广播的数据;通过Context的sendOrderedBroadcast()发送普通广播
<intent-filter android:priority="20">
<action android:name="com.simware.BroadcastReceiverDemo" >
</action>
</intent-filter>
Service和Activity的通信方式
1、bindService()启动service,通过内部钩子IBinder对象实现两者的沟通
2、startService()启动service,借助BroadcastReceiver来实现数据通信,此时最好将Receiver定义为Activity的内部类,这样Receiver可以直接操控activity的数据。