经常会遇到这种情况,就是接受广播之后,进行一些操作,如果是一些耗时操作(超过10s)的话,会报错的,那怎么解决呢?通常的做法是在BroadcastReceiver里面开启一个Service,在Service里面执行耗时操作。所以,Service+BroadcastReceiver组合是比较常见的。
public class MyBroadcastReceiver extends BroadcastReceiver { // 来电电话 private String incomingNumber; @Override public void onReceive(Context context, Intent intent) { // 获取电话管理服务,以便获得电话的状态 TelephonyManager tm = (TelephonyManager) context .getSystemService(Service.TELEPHONY_SERVICE); if (tm.getCallState() == TelephonyManager.CALL_STATE_RINGING) { // 获得来电的电话号 incomingNumber = intent.getStringExtra("incoming_number"); Intent serviceIntent = new Intent(context, MyService.class); serviceIntent.putExtra("number", incomingNumber); //启动Service Log.d("checkinstall","服务启动"); context.startService(serviceIntent); } } }
public class MyService extends Service { private String number; private Context context; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); } @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub number = intent.getStringExtra("number"); context = this.getApplicationContext(); showDlg(); super.onStart(intent, startId); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } // 显示动画 private void showDlg() { ... } }
注册service和BroadcastReceiver
<service android:enabled="true" android:name="cn.com.example.MyService" /> <!-- 来电 --> <receiver android:name="cn.com.example.MyBroadcastReceiver" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> </receiver>
原文:http://my.oschina.net/carbenson/blog/523934