zoukankan      html  css  js  c++  java
  • Service和广播联合更新UI的例子

     

    在Android中,异步更新UI,通常我们会选用Handler启动线程,或者sendMessage的方式,那么利用Service和广播也可以更新UI的,例子如下:
    我们建立一个Service:
    package com.andy
    import android.app.Service;//引入相关包
    import android.content.BroadcastReceiver;//引入相关包
    import android.content.Context;//引入相关包
    import android.content.Intent;//引入相关包
    import android.content.IntentFilter;//引入相关包
    import android.os.IBinder;//引入相关包
    //继承自Service的子类
    public class MyService extends Service{
            CommandReceiver cmdReceiver;
            boolean flag;
            @Override
            public void onCreate() {//重写onCreate方法
                    flag = true;
                    cmdReceiver = new CommandReceiver();
                    super.onCreate();
            }
            @Override
            public IBinder onBind(Intent intent) {//重写onBind方法
                    // TODO Auto-generated method stub
                    return null;
            }
            @Override
            public int onStartCommand(Intent intent, int flags, int startId) {//重写onStartCommand方法
                    IntentFilter filter = new IntentFilter();//创建IntentFilter对象
                    filter.addAction("wyf.wpf.MyService");
                    registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver
                    doJob();//调用方法启动线程
                    return super.onStartCommand(intent, flags, startId);
            }
            //方法:
            public void doJob(){
                    new Thread(){
                            public void run(){
                                    while(flag){
                                            try{//睡眠一段时间
                                                    Thread.sleep(1000);
                                            }
                                            catch(Exception e){
                                                    e.printStackTrace();
                                            }
                                            Intent intent = new Intent();//创建Intent对象
                                            intent.setAction("wyf.wpf.Sample_3_6");
                                            intent.putExtra("data", Math.random());
                                            sendBroadcast(intent);//发送广播
                                    }                               
                            }
                           
                    }.start();
            }       
            private class CommandReceiver extends BroadcastReceiver{//继承自BroadcastReceiver的子类
                    @Override
                    public void onReceive(Context context, Intent intent) {//重写onReceive方法
                            int cmd = intent.getIntExtra("cmd", -1);//获取Extra信息
                            if(cmd == Sample_3_6.CMD_STOP_SERVICE){//如果发来的消息是停止服务                               
                                    flag = false;//停止线程
                                    stopSelf();//停止服务
                            }
                    }               
            }
            @Override
            public void onDestroy() {//重写onDestroy方法
                    this.unregisterReceiver(cmdReceiver);//取消注册的CommandReceiver
                    super.onDestroy();
            }       
    }

    建立一个activity

    package com.andy;//声明包语句
    import android.app.Activity;//引入相关包
    import android.content.BroadcastReceiver;//引入相关包
    import android.content.Context;//引入相关包
    import android.content.Intent;//引入相关包
    import android.content.IntentFilter;//引入相关包
    import android.os.Bundle;//引入相关包
    import android.view.View;//引入相关包
    import android.view.View.OnClickListener;//引入相关包
    import android.widget.Button;//引入相关包
    import android.widget.TextView;//引入相关包
    //继承自Activity的子类
    public class Sample_3_6 extends Activity {
            public static final int CMD_STOP_SERVICE = 0;
            Button btnStart;//开始服务Button对象应用
            Button btnStop;//停止服务Button对象应用
            TextView tv;//TextView对象应用
            DataReceiver dataReceiver;//BroadcastReceiver对象
            @Override
        public void onCreate(Bundle savedInstanceState) {//重写onCreate方法
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);//设置显示的屏幕
            btnStart = (Button)findViewById(R.id.btnStart);
            btnStop = (Button)findViewById(R.id.btnStop);
            tv = (TextView)findViewById(R.id.tv);
            btnStart.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听               
                            @Override
                            public void onClick(View v) {//重写onClick方法
                                    Intent myIntent = new Intent(Sample_3_6.this, wyf.wpf.MyService.class);
                                    Sample_3_6.this.startService(myIntent);//发送Intent启动Service
                            }
                    });
            btnStop.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听       
                            @Override
                            public void onClick(View v) {//重写onClick方法
                                    Intent myIntent = new Intent();//创建Intent对象
                                    myIntent.setAction("wyf.wpf.MyService");
                                    myIntent.putExtra("cmd", CMD_STOP_SERVICE);
                                    sendBroadcast(myIntent);//发送广播
                            }
                    });
        }       
            private class DataReceiver extends BroadcastReceiver{//继承自BroadcastReceiver的子类
                    @Override
                    public void onReceive(Context context, Intent intent) {//重写onReceive方法
                            double data = intent.getDoubleExtra("data", 0);
                            tv.setText("Service的数据为:"+data);                       
                    }               
            }
            @Override
            protected void onStart() {//重写onStart方法
                    dataReceiver = new DataReceiver();
                    IntentFilter filter = new IntentFilter();//创建IntentFilter对象
                    filter.addAction("wyf.wpf.Sample_3_6");
                    registerReceiver(dataReceiver, filter);//注册Broadcast Receiver
                    super.onStart();
            }
            @Override
            protected void onStop() {//重写onStop方法
                    unregisterReceiver(dataReceiver);//取消注册Broadcast Receiver
                    super.onStop();
            }

    }

  • 相关阅读:
    SVN增加文件后,文件无法自动包括在项目中的原因
    关于浏览器和IIS基础的简单理解
    关联查询之速度优化
    <>这个符号表示泛型的意思
    傅里叶变换
    distinct和group by的性能比较
    VS2010 代码前出现虚线
    SQL的 like 中间字符通配 用法
    模态对话框中的window.close关闭时会打开新页面
    最大差值
  • 原文地址:https://www.cnblogs.com/xgjblog/p/3816734.html
Copyright © 2011-2022 走看看