点击Button 开启Service–>AsyncTask
Activty与Service数据的传递 用的是Messenger
所遇到问题: The specified message queue synchronization barrier token has not been posted or has already been remove
原因:把Message message=handler.obtainMessage();的声明实例化放到了TimerTask的Run方法之外 导致消息第二次使用的时候 已经被回收。
Activity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button sms;
private Messenger activity_messenger,service_messenger;
private Intent bindService;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sms=(Button)findViewById(R.id.sendsms);
sms.setOnClickListener(this);
progressBar=(ProgressBar)findViewById(R.id.progress);
bindService=new Intent(this,UpdateService.class);
bindService(bindService, serviceConnection,Service.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
stopService(bindService);
}
ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder ibinder) {
Log.i("serviceConnection", "serviceConnection serviceConnection");
service_messenger=new Messenger(ibinder);
activity_messenger=new Messenger(handler);
Message message=new Message();
message.what=UpdateService.MSG_BIND;
message.replyTo=activity_messenger;
try {
service_messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.i("onServiceDisconnected", "onServiceDisconnected onServiceDisconnected");
}
};
@Override
public void onClick(View view) {
if(view.getId()==R.id.sendsms){
//按钮不可点击
sms.setEnabled(false);
//开启服务 倒计时
Message message=new Message();
message.what=UpdateService.MSG_START;
message.obj="12345678910";
try {
service_messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
int seconds=msg.arg1;
switch (msg.what){
case UpdateService.MSG_UPDATE:
Log.i("UPDATEA", "handleMessage:======"+seconds);
sms.setText("短信已发送 "+seconds);
break;
case UpdateService.MSG_DONE:
Log.i("DONE", "handleMessage:======"+seconds);
//倒计时完毕
sms.setEnabled(true);
sms.setText("获取验证消息");
stopService(bindService);
break;
}
}
};
}
Service
/**
* Created by Administrator on 2016/8/9.
*/
public class UpdateService extends Service {
public static final int MSG_BIND=001;
public static final int MSG_START=004;
public static final int MSG_UPDATE=002;
public static final int MSG_DONE=003;
private static int SECONDS=15;
private Messenger activity_messenger;
private Messenger messenger;
private Timer timer;
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("onBind", "onBind onBind");
messenger=new Messenger(handler);
return messenger.getBinder();
}
@Override
public void onCreate() {
Log.i("onCreate", "onCreate:onCreate ");
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("onStartCommand", "onStartCommand:onStartCommandonStartCommand ");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
public Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MSG_BIND:
activity_messenger= msg.replyTo;
break;
case MSG_START:
//获取手机号码
String telNum=msg.obj.toString();
//调用发送短信线程
SendMSM sendMSM=new SendMSM();
sendMSM.execute(telNum);
//开启倒计时
timer=new Timer();
timer.schedule(timerTask,1000,1000);
break;
}
}
};
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
Message message=handler.obtainMessage();
SECONDS=SECONDS-1;
message.what=MSG_UPDATE;
if(SECONDS<0){
message.what=MSG_DONE;
timer.cancel();
}
message.arg1=SECONDS;
try {
activity_messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
}
/**
* Created by Administrator on 2016/8/9.
*/
public class SendMSM extends AsyncTask<String,Integer,String> {
@Override
protected String doInBackground(String... strings) {
Log.i("发送短信至:", strings[0]);
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}