在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();
        }

}

Service和广播联合更新UI的例子的更多相关文章

  1. Android线程间通信更新UI的方法(重点分析EventBus)

    Android的UI更新只能在UI线程中,即主线程.子线程中如果要进行UI更新,都是要通知主线程来进行. 几种实现方式总结如下,欢迎补充. 1.runOnUiThread() 子线程中持有当前Acti ...

  2. Android开发——实现子线程更新UI

    Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行 ...

  3. 在Android中实现service动态更新UI界面

    之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的.那么如何实现service动态更新UI界面呢?案例:通过service ...

  4. Android 通过广播来异步更新UI

    之前的项目里要做一个异步更新UI的功能,可是结果出现了ANR,所以想写个demo来測试究竟是哪个地方出现了问题,结果发现原来的思路是没有问题,郁闷~~ 如今这个demo 就是模拟项目里面 的步骤 1. ...

  5. 利用广播调用后台服务方法并根据方法返回的内容更新UI

    一.UI布局代码 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  6. OkHttp3几个简单的例子和在子线程更新UI线程的方法

    okHttp用于android的http请求.据说很厉害,我们来一起尝尝鲜.但是使用okHttp也会有一些小坑,后面会讲到如何掉进坑里并爬出来. 首先需要了解一点,这里说的UI线程和主线程是一回事儿. ...

  7. Service 动态更新 UI

    http://blog.csdn.net/u013724061/article/details/38642049 最终效果: 动态显示当前时间和电量 思路: 首先在Activity里用内部类定义两种广 ...

  8. 关于Handler的理解,子线程不能更新UI的纠正和回调的思考

    开发Android这么久了,总会听到有人说:主线程不能访问网络,子线程不能更新UI.Android的主线程的确不能长时间阻塞,但是子线程为什么不能更新UI呢?今天把这些东西整理,顺便在子线程更新UI. ...

  9. 【用户交互】APP没有退出前台但改变系统属性如何实时更新UI?监听系统广播,让用户交互更舒心~

    前日,一小伙伴问我一个问题,说它解决了半天都没解决这个问题,截图如下: 大概楼主理解如下: 如果在应用中有一个判断wifi的开关和一个当前音量大小的seekbar以及一个获取当前电量多少的按钮,想知道 ...

随机推荐

  1. Objective-C面向对象之实现类

    一般涉及到面向对象都会C#,Java都不可避免的涉及到类,C#中类的后缀名是.cs,Java中是.java,Object-C中一般用两个文件描述一个类,后缀名为.h为类的声明文件,用于声明成员变量和方 ...

  2. vue当前路由跳转初步研究

    一样闲话少说,直接上问题,如图: 也是消息面板,没想到一个小小的消息面板,碰到这么多坑,惆怅. 就是如果当前路由和跳转路由不一样时,正常跳转没有任何问题.但是如果一样时,就不会跳转了,用了很多方法,比 ...

  3. JavaScript事件代理和事件委托

    一.概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的 ...

  4. 【Docker】基于docker+etcd+confd + haproxy构建高可用、自发现的web服务

    各个工具介绍 (1)Docker:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux机器上,也可以实现虚拟化,docker ...

  5. WPF Converter 使用复杂参数的方法

    Step 1在WPF的C#代码文件中给定义复杂类型的变量,并给其赋值:Sample code: List<User>lsUser=....Setp 2在 C#代码对应的XAML 中将此复杂 ...

  6. java泛型中extends 和 super的区别

    一般对泛型中extends 和 super 的区别是这样介绍的: 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 < ...

  7. Hive Python Streaming的原理及写法

    在Hive中,须要实现Hive中的函数无法实现的功能时,就能够用Streaming来实现. 其原理能够理解成:用HQL语句之外的语言,如Python.Shell来实现这些功能,同一时候配合HQL语句, ...

  8. ubuntu 软件包管理工具 dpkg,apt-get,aptitude 区别

    ubuntu 软件包管理工具 dpkg,apt-get,aptitude 区别 一:dpkg dpkg 是一种比较低层的软件包安装管理工具,在安装时,不会安装软件包的依赖关系:只能安装所要求的软件包: ...

  9. LESS详解之变量(@)

    变量基本上是每个语言脚本上都会涉及的一个小小知识点,是学好语言脚本的必经之路.LESS中也可以设置变量,然后通过变量可以改变整个网站的设计风格.良好的掌握LESS中变量的用法,是LESS的基础. 变量 ...

  10. 【Oracle】RAC 10.2.0.1升级10.2.0.5

    环境: OS:OEL5.6 RAC:10.2.0.1.0 相关环境变量: CRS_HOME /u01/app/oracle/product/10.2.0/db_1 ORACLE_HOME   /u01 ...