Android 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 = newCommandReceiver();
             super.onCreate();
       }
       @Override
       public IBinder onBind(Intent intent){//重写onBind方法
              // TODO Auto-generated methodstub
              return null;
       }
       @Override
       public int onStartCommand(Intent intent, intflags, int startId) {//重写onStartCommand方法
              IntentFilter filter = newIntentFilter();//创建IntentFilter对象
             filter.addAction("wyf.wpf.MyService");
              registerReceiver(cmdReceiver,filter);//注册Broadcast Receiver
             doJob();//调用方法启动线程
              returnsuper.onStartCommand(intent, flags, startId);
       }
       //方法:
       public void doJob(){
              newThread(){
                     publicvoid run(){
                           while(flag){
                                  try{//睡眠一段时间
                                        Thread.sleep(1000);
                                  }
                                  catch(Exceptione){
                                        e.printStackTrace();
                                  }
                                  Intent intent = newIntent();//创建Intent对象
                                 intent.setAction("wyf.wpf.Sample_3_6");
                                  intent.putExtra("data",Math.random());
                                 sendBroadcast(intent);//发送广播
                           }
                    }

              }.start();
       }
       private class CommandReceiver extendsBroadcastReceiver{//继承自BroadcastReceiver的子类
              @Override
              public void onReceive(Contextcontext, 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;
       ButtonbtnStart;//开始服务Button对象应用
       Button btnStop;//停止服务Button对象应用
       TextView tv;//TextView对象应用
       DataReceiverdataReceiver;//BroadcastReceiver对象
       @Override
    public void onCreate(BundlesavedInstanceState) {//重写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(newOnClickListener() {//为按钮添加点击事件监听
                    @Override
                     publicvoid 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(newOnClickListener() {//为按钮添加点击事件监听
                    @Override
                     publicvoid onClick(View v) {//重写onClick方法
                           Intent myIntent = newIntent();//创建Intent对象
                          myIntent.setAction("wyf.wpf.MyService");
                           myIntent.putExtra("cmd",CMD_STOP_SERVICE);
                           sendBroadcast(myIntent);//发送广播
                    }
              });
    }
       private class DataReceiver extendsBroadcastReceiver{//继承自BroadcastReceiver的子类
              @Override
              public void onReceive(Contextcontext, Intent intent) {//重写onReceive方法
                     doubledata = intent.getDoubleExtra("data", 0);
                    tv.setText("Service的数据为:"+data);
              }
       }
       @Override
       protected void onStart(){//重写onStart方法
              dataReceiver = newDataReceiver();
              IntentFilter filter = newIntentFilter();//创建IntentFilter对象
             filter.addAction("wyf.wpf.Sample_3_6");
             registerReceiver(dataReceiver, filter);//注册BroadcastReceiver
             super.onStart();
       }
       @Override
       protected void onStop(){//重写onStop方法
             unregisterReceiver(dataReceiver);//取消注册BroadcastReceiver
             super.onStop();
       }

}
时间: 2024-10-30 15:50:27

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

Android使用Handler和Message更新UI

在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用到Handler和Message来实现 Demo中,使用到一个按钮和一个TextView,点击按钮之后改变TextView的内容,按钮点击时候新建一个进程,在进程中对UI控件进行修改. public class MainActivity extends Activity implements OnClickListener { private static

Android 在其他线程中更新UI线程的解决方法_Android

方法一:Activity.runOnUiThread(Runnable )(经验之道: 这个最好用, 凡是要刷新页面的地方,Activity.runOnUiThread( new Runnable()  { public void run(){更新UI}}); 方法二:子线程调用Handler的sendMessage(message)发送事件. 复制代码 代码如下: mHandler = new Handler() {     @Override     public void handleMe

Android 当数据库变动时更新UI数据 注册观察者监听

/** * Register an observer for provider status changes - we will need to * reflect them in the UI. */ private void registerObserver() { getContentResolver().registerContentObserver( ContactsContract.Contacts.CONTENT_URI, true, mObserver); getContentR

Android更新UI的四种方法详解_Android

前言 相信每位Android开发者们都知道更新UI只能在主线程中进行,若是在子线程执行任务后需要更新UI,则需要借助handler跳转到主线程中.以下介绍几种操作UI的方法. 一.使用Handler的handleMessage() Handler的构造 public Handler() { this(null, false); } public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { fina

Android开发之子线程操作UI的几种方法_Android

 在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如

Android开发之子线程操作UI的几种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如果

java-android中使用按钮来更新UI

问题描述 android中使用按钮来更新UI 使用以下代码想实现:当点击一个按钮后要显示一个图像,两秒后这个图像又变得不可见. button.setOnClickListener(new OnClickListener() { public void onClick(View v) { firstImage.setVisibility(ImageView.VISIBLE); // delay of some sort firstImage.setVisibility(ImageView.INVI

在Android中实现Service动态更新UI界面(Service与主程序Activity之间的数据交互或控制)

案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务. 方案一:使用广播+Service 注册BroadcastReceiver 1.在主程序activity中注册一个BroadcastReceiver,用于接收Service发布的广播. @Override protected void onStart() {//重写onStart方法 dataReceiver = new DataReceiver(); IntentFilter

android 下载 跨界面更新UI

问题描述 android 下载 跨界面更新UI 项目遇到问题,在一个activity中点击下载一堆文件,然后需要在另一个activity中的fragment中的listview中更新正在下载的item的进度. 我是使用广播加异步更新.但总觉得效率有点慢.有更好的方法吗?