service服务:
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。
Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中 通过<service>来声明。可以通过contect.startservice和contect.bindserverice来启动。
Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。
public class PaymentService extends Service {
private SharedPreferences mPrefs;
private String mCurBookId;
@Override
public void onCreate() {
super.onCreate();
mPrefs = getSharedPreferences(MBookMonoApplication.SHAPRED_PREFERENCES_NAME, MODE_PRIVATE);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
mCurBookId = (String) intent.getSerializableExtra("book_id");
TaskExecutor.executeTask(new Runnable() {
public void run() {
sendPaymentSMS();
}
});
super.onStart(intent, startId);
}
private String getPaymentNumber () {
return "5556";
}
public void sendPaymentSMS () {
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
boolean flag = true;
if(flag) {
setCurrentBookAsPaid();
}
break;
}
unregisterReceiver(this);
stopSelf();
}
private void setCurrentBookAsPaid() {
mPrefs.edit().putInt("book_paid_"+mCurBookId, 1).commit();
}
}, new IntentFilter(MBookMonoApplication.SMS_SENT_BROADCAST));
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(MBookMonoApplication.SMS_SENT_BROADCAST), 0);
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(getPaymentNumber(), null, "CXGPRSTC", sentPI, null);
}
}
调用:
private void sendPaymentSMS (final Notifier successNotifier) {
mPaymentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
boolean flag = true;
if(flag) {
mPaid = true;
new AlertDialog.Builder(MBookMonoReaderActivity.this)
.setMessage("恭喜你!购买成功!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
successNotifier.onNotified(1, 0, 0);
}
}).create().show();
}
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
new AlertDialog.Builder(MBookMonoReaderActivity.this)
.setMessage("购买失败!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}).create().show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
new AlertDialog.Builder(MBookMonoReaderActivity.this)
.setMessage("没有服务,购买失败!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}).create().show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
new AlertDialog.Builder(MBookMonoReaderActivity.this)
.setMessage("购买失败2!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}).create().show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
new AlertDialog.Builder(MBookMonoReaderActivity.this)
.setMessage("请打开网络再次尝试!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}).create().show();
break;
}
unregisterReceiver(this);
mPaymentReceiver = null;
}
};
registerReceiver(mPaymentReceiver, new IntentFilter(MBookMonoApplication.SMS_SENT_BROADCAST));
Intent intent = new Intent(this, PaymentService.class);
intent.putExtra("book_id", mCurBookId);
startService(intent);
}