[Android实例] Service和广播联合更新UI的例子

本文介绍了一个在Android应用中利用Service和广播异步更新UI的实例。通过创建一个Service类,实现了定时发送广播,同时在Activity中接收并处理这些广播,更新UI显示。这种做法适用于需要定时更新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();
       }
}



【多变量输入超前多步预测】基于CNN-BiLSTM的光伏功率预测研究(Matlab代码实现)内容概要:本文介绍了基于CNN-BiLSTM模型的多变量输入超前多步光伏功率预测方法,并提供了Matlab代码实现。该研究结合卷积神经网络(CNN)强大的特征提取能力与双向长短期记忆网络(BiLSTM)对时间序列前后依赖关系的捕捉能力,构建了一个高效的深度学习预测模型。模型输入包含多个影响光伏发电的气象与环境变量,能够实现对未来多个时间步长的光伏功率进行精确预测,适用于复杂多变的实际应用场景。文中详细阐述了数据预处理、模型结构设计、训练流程及实验验证过程,展示了该方法相较于传统模型在预测精度稳定性方面的优势。; 适合人群:具备一定机器学习深度学习基础,熟悉Matlab编程,从事新能源预测、电力系统分析或相关领域研究的研发人员与高校研究生。; 使用场景及目标:①应用于光伏电站功率预测系统,提升电网调度的准确性与稳定性;②为可再生能源并网管理、能量存储规划及电力市场交易提供可靠的数据支持;③作为深度学习在时间序列多步预测中的典型案例,用于科研复现与教学参考。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注数据归一化、CNN特征提取层设计、BiLSTM时序建模及多步预测策略的实现细节,同时可尝试引入更多外部变量或优化网络结构以进一步提升预测性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值