经常会遇到这种情况,就是接受广播之后,进行一些操作,如果是一些耗时操作(超过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