Android 在service 更新activity UI

一种方式:广播

通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务。

注册BroadcastReceiver

在主程序activity中注册一个BroadcastReceiver,用于接收Service发布的广播。

 
 
  1. @Override 
  2. protected void onStart() {//重写onStart方法  
  3.     dataReceiver = new DataReceiver();  
  4.     IntentFilter filter = new IntentFilter();//创建IntentFilter对象  
  5.     filter.addAction("com.justel.serviceBC");  
  6.     registerReceiver(dataReceiver, filter);//注册Broadcast Receiver  
  7.     super.onStart();  

停止service命令

主程序activity可发布广播,用于向后台service传递数据或控制信息,如停止service命令。

 
 
  1.       btnStop.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听     
  2.     @Override 
  3.     public void onClick(View v) {//重写onClick方法  
  4.         Intent myIntent = new Intent();//创建Intent对象  
  5.         myIntent.setAction("com.justel.service");  
  6.         myIntent.putExtra("cmd", CMD_STOP_SERVICE);  
  7.         sendBroadcast(myIntent);//发送广播  
  8.     }  
  9. }); 

接收广播

后台service注册BroadCastReceiver用于接受主程序发送的广播

 
 
  1. @Override 
  2. public int onStartCommand(Intent intent, int flags, int startId) {//重写onStartCommand方法  
  3.     IntentFilter filter = new IntentFilter();//创建IntentFilter对象  
  4.     filter.addAction("com.justel.service");  
  5.     registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver  
  6.     doJob();//调用方法启动线程,自己来完成  
  7.     return super.onStartCommand(intent, flags, startId);  

实时发送 

后台service在doJob()方法中连接服务器并向主程序实时发送广播。

 
 
  1. /**  
  2.  * 启动一个子纯种并连接服务器,接收服务器返回数据data。代码略。。。  
  3.  */ 
  4. Object data;//服务器返回的数据data  
  5. Intent intent = new Intent();//创建Intent对象  
  6. intent.setAction("com.justel.service");  
  7. intent.putExtra("data", data);  
  8. 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();
    }
}
复制代码

 





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值