一种方式:广播
通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务。
注册BroadcastReceiver
在主程序activity中注册一个BroadcastReceiver,用于接收Service发布的广播。
- @Override
- protected void onStart() {//重写onStart方法
- dataReceiver = new DataReceiver();
- IntentFilter filter = new IntentFilter();//创建IntentFilter对象
- filter.addAction("com.justel.serviceBC");
- registerReceiver(dataReceiver, filter);//注册Broadcast Receiver
- super.onStart();
- }
停止service命令
主程序activity可发布广播,用于向后台service传递数据或控制信息,如停止service命令。
- btnStop.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听
- @Override
- public void onClick(View v) {//重写onClick方法
- Intent myIntent = new Intent();//创建Intent对象
- myIntent.setAction("com.justel.service");
- myIntent.putExtra("cmd", CMD_STOP_SERVICE);
- sendBroadcast(myIntent);//发送广播
- }
- });
接收广播
后台service注册BroadCastReceiver用于接受主程序发送的广播
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {//重写onStartCommand方法
- IntentFilter filter = new IntentFilter();//创建IntentFilter对象
- filter.addAction("com.justel.service");
- registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver
- doJob();//调用方法启动线程,自己来完成
- return super.onStartCommand(intent, flags, startId);
- }
实时发送
后台service在doJob()方法中连接服务器并向主程序实时发送广播。
- /**
- * 启动一个子纯种并连接服务器,接收服务器返回数据data。代码略。。。
- */
- Object data;//服务器返回的数据data
- Intent intent = new Intent();//创建Intent对象
- intent.setAction("com.justel.service");
- intent.putExtra("data", data);
- sendBroadcast(intent);//发送广播
至此,我们实现了主程序通过接收广播实时更新应用的UI界面。
第二种:直接将activity的要更新的UI传入Binder中
1 package com.gqs.service; 2 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.Binder; 6 import android.os.Handler; 7 import android.os.IBinder; 8 import android.os.Message; 9 import android.widget.TextView; 10 11 public class UpdateService extends Service { 12 private int data; 13 private Handler handler; 14 15 @Override 16 public IBinder onBind(Intent intent) { 17 // TODO Auto-generated method stub 18 return new MyBinder(); 19 } 20 21 public class MyBinder extends Binder { 22 public void setDate(final TextView tv, final UpdateData updata) { 23 new Thread(new MyThread()).start(); 24 handler = new Handler() { 25 public void handleMessage(Message msg) { 26 updata.update(tv, data); 27 } 28 }; 29 } 30 } 31 32 public class MyThread implements Runnable { 33 34 @Override 35 public void run() { 36 while (true) { 37 data++; 38 Message msg = handler.obtainMessage(); 39 msg.arg1 = data; 40 handler.sendMessage(msg); 41 try { 42 Thread.sleep(1000); 43 } catch (InterruptedException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 } 48 } 49 50 } 51 52 public interface UpdateData { 53 public void update(TextView tv, int data); 54 55 } 56 }
用来显示的Activity
package com.gqs.activity; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.gqs.service.UpdateService; import com.gqs.service.UpdateService.MyBinder; import com.gqs.service.UpdateService.UpdateData; public class ServiceToActivityActivity extends Activity { /** Called when the activity is first created. */ private TextView tv; private UpdateService.MyBinder binder; private Button btnStart; private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub binder=(MyBinder) service; tv.setText("已连接"); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStart=(Button)findViewById(R.id.btnStart); tv=(TextView)findViewById(R.id.textView); Intent intent=new Intent(this,UpdateService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(binder!=null) { binder.setDate(tv, new UpdateData() { @Override public void update(TextView tv, int data) { // TODO Auto-generated method stub tv.setText(data+""); } }); } else { Toast.makeText(getApplicationContext(), "连接失败", 1).show(); } } }); } @Override protected void onDestroy() { // TODO Auto-generated method stub unbindService(conn); super.onDestroy(); } }