Service通过广播Broadcast更新Activity UI

来源:互联网 发布:如何下载淘宝网到桌面 编辑:程序博客网 时间:2024/06/09 13:38

本人小菜鸟一枚,第一次发帖,只想和大家分享一下自己敲代码过程中遇到的问题,在学习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)。将publicclassMyReceiver extends BroadcastReceiver

改为

public static class MyReceiver extends BroadcastReceiver{

并将

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














点击打开链接




0 0
原创粉丝点击