本人小菜鸟一枚,第一次发帖,只想和大家分享一下自己敲代码过程中遇到的问题,在学习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"); //构造函数,做一些初始化工作,本例中无任何作用 }
去掉,将其中的控件常量申明为静态后,再运行就可以了