转自:http://blog.sina.com.cn/s/blog_610c1cad01016tn4.html
利用service发送广播
sendBroadcast这个方法是定义在ContextWrapper里的,而Service是继承ContextWrapper的。(底层的步骤) @Override public void sendBroadcast(Intent intent) { mBase.sendBroadcast(intent); } 发送的时候直接调用 sendBroadcast(new Intent(a.this,b.class));//写在service中
2.Service开发详解
服务的开发比较简单,如下:
第一步:继承Service类
public
第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:
<service
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,访问者与服务之间没有关连,即使访问者退出了,服务仍然运行。使用bindService()方法启用服务,访问者与服务绑定在了一起,访问者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
采用Context.startService()方法启动服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
startService 与 bindService区别如下:
- 生命周期:startService方式启动,Service是通过接受Intent并且会经历onCreate和onStart。当用户在发出意图使之销毁时会经历onDestory而bindService方式启动,与Activity绑定的时候,会经历onCreate和onBind,而当Activity被销毁的时候,Service会先调用onUnbind然后是onDestory.
- 控制方式:牵着的控制方式需要使用固定的方法,对Service进行单一的操作。而后者由于与Activity绑定,不用考虑其生命周期问题,并且从发送Intent的被动操作,变为可以主动对Service对象进行操作,我们深圳可以建立一个Handler类,对Service进行相关的操作。大大加强了Service的灵活性、可操作性。
- 总结:对于简单的应用startService启动方式能带来更少的代码,简单的操作,对于复杂的应用bindService方式,虽然带来的更多的编码,但同时也带来了更好的可操作性,使其实用起来更像Activity。
3.BroadcastReceiver开发详解
3.1BroadcastReceiver广播接收者
要实现一个广播接收者方法如下:
第一步:继承BroadcastReceiver,并重写onReceive()方法。
public
}
第二步:订阅感兴趣的广播Intent,订阅方法有两种:
第一种:使用代码进行订阅
- IntentFilter
filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); - IncomingSMSReceiver
receiver = new IncomingSMSReceiver(); - registerReceiver(receiver,
filter);
第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:
- <receiver
android:name=".IncomingSMSReceiver"> -
<intent-filter> -
<action android:name="android.provider.Telephony.SMS_RECEIVED"/> -
</intent-filter> - </receiver>
Context.sendBroadcast()
Context.sendOrderedBroadcast()
系统收到短信,发出的广播属于有序广播。如果想阻止用户收到短信,可以通过设置优先级,让你们自定义的接收者先获取到广播,然后终止广播,这样用户就接收不到短信了。
3.2广播接收者的响应
在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive()
- public
class IncomingSMSReceiver extends BroadcastReceiver { -
@Override public void onReceive(Context context, Intent intent) { -
//发送Intent启动服务,由服务来完成比较耗时的操作 -
Intent service = new Intent(context, XxxService.class); -
context.startService(service); -
} - }
3.3常见系统广播接收者
除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
接收电池电量变化广播Intent
<receiver
</receiver>
<receiver
</receiver>
并且要进行权限声明:
<uses-permission
接收短信广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
<action
</intent-filter>
</receiver>
在AndroidManifest.xml文件中添加以下权限:
<uses-permission
<uses-permission
4.简单实例
- public
class ClientActivity extends Activity { -
-
private ICountService countService; -
-
@Override -
public void onCreate(Bundle savedInstanceState) { -
super.onCreate(savedInstanceState); -
setContentView(R.layout.main); -
this.bindService(new Intent(this, CountService.class), -
this.serviceConnection, BIND_AUTO_CREATE); -
} -
-
@Override -
protected void onDestroy() { -
super.onDestroy(); -
this.unbindService(serviceConnection); -
} -
@Override -
public boolean onKeyUp(int keyCode, KeyEvent event) { -
if(keyCode==KeyEvent.KEYCODE_BACK) -
{ -
this.unbindService(serviceConnection); -
this.finish(); -
return true; -
} -
return super.onKeyUp(keyCode, event); -
} -
private ServiceConnection serviceConnection = new ServiceConnection() { -
@Override -
public void onServiceConnected(ComponentName name, IBinder service) { -
countService = (ICountService) service;// 对于本地服务,获取的实例和服务onBind()返回的实例是同一个 -
int i = countService.getCount(); -
Log.v("CountService", "Count is " + i); -
} -
-
@Override -
public void onServiceDisconnected(ComponentName name) { -
countService = null; -
} -
}; -
- }