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