Service通过广播Broadcast更新Activity UI

本人小菜鸟一枚,第一次发帖,只想和大家分享一下自己敲代码过程中遇到的问题,在学习Broadcast receiver的时候看到了这篇文章,模仿着做了一遍,发现了一些不同的地方,仅供学友参考参考,不喜勿喷,谢谢!

MainActivity

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btnStart,btnStop,btnRegist,btnStopRecv;
    public static ProgressBar pb;
    public static TextView textView;
    MyReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnStart= (Button) findViewById(R.id.btn_start_service);
        btnStop= (Button) findViewById(R.id.btn_stop_service);
        btnRegist= (Button) findViewById(R.id.btn_registe_receiver);
        btnStopRecv= (Button) findViewById(R.id.btn_stop_receiver);
        pb= (ProgressBar) findViewById(R.id.progress_bar);
        textView= (TextView) findViewById(R.id.tv);
        btnStart.setOnClickListener(this);
        btnStop.setOnClickListener(this);
        btnRegist.setOnClickListener(this);
        btnStopRecv.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {
        Intent intent=new Intent(MainActivity.this,MyService.class);
        switch (view.getId()){
            case R.id.btn_start_service:
                startService(intent);
                break;
            case R.id.btn_stop_service:
                stopService(intent);
                break;
            case R.id.btn_registe_receiver:
                receiver=new MyReceiver();
                IntentFilter filter=new IntentFilter();
                filter.addAction("com.example.MyBroadCast");
                MainActivity.this.registerReceiver(receiver,filter);
                break;
            case R.id.btn_stop_receiver:
                MainActivity.this.unregisterReceiver(receiver);
                break;
        }
    }
    //自定义一个广播接收器
    public static class MyReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("onReceive");
            Bundle bundle=intent.getExtras();
            int a=bundle.getInt("i");
            pb.setProgress(a);
            textView.setText(String.valueOf(a));
        }

    }
}


MyService


import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class MyService extends Service {
    boolean isStop=false;


    @Override
    public void onCreate() {
        System.out.println("======onCreate=====");
        super.onCreate();
    }
    @Override
    public int onStartCommand( Intent intent, int flags, int startId) {
        System.out.println("======onStartCommand=====");
      new Thread(){
            @Override
            public void run() {
                int i=0;
                while (!isStop){
                    Intent intent1=new Intent();
                    intent1.putExtra("i",i);
                    i++;
                    intent1.setAction("com.example.MyBroadCast");
                    sendBroadcast(intent1);
                    System.out.println("i---------"+i);
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("======onBind=====");
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("======onUnbind=====");
        return super.onUnbind(intent);
    }
    @Override
    public void onDestroy() {
        System.out.println("======onDestroy=====");
        isStop=true;
        super.onDestroy();
    }
}



注意:我一开始照着原博主打的时候程序秒退

在网上查了半天也没查出来,最后请教别人才解决了问题

在自定义Receiver的时候,最好定义为静态的,因为不定义为静态的话,程序一启动就容易秒退,然后报错(主要是说java.lang.RuntimeException: Unable to start receiverno和no zero argument constructor)。将 public class MyReceiver extends BroadcastReceiver

改为

public static class MyReceiver extends BroadcastReceiver{

并将

public MyReceiver(){ System.out.println("MyReceiver"); //构造函数,做一些初始化工作,本例中无任何作用 }去掉,将其中的控件常量申明为静态后,再运行就可以了














点击打开链接




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值