1.BroadcastReceiver属于Android的四大组件之一。
分为:无序广播和有序广播
无序广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器会在同一时间接收到这条广播,广播无法被截断。
有序广播是一种同步执行的广播,在广播发出之后,优先级高的广播接收器可以优先接收到这条广播,并可以在优先级较低的广播接收器之前截断停止发送这条广播。
2.注册方式:
静态注册:只需在清单文件中注册即可。但Android8.0以后就取消了静态注册的方式。所以不建议使用。
动态注册:就是要在代码中来实现注册注销。
package com.ysl.myandroidbase.activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import com.ysl.myandroidbase.receiver.MyReceiver;
public class MainActivity extends AppCompatActivity implements FragmentListener {
public static final String TAG = "MainActivity";
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate is invoke ");
myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("cn.ysl");
registerReceiver(myReceiver, intentFilter);
findViewById(R.id.tv1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("cn.ysl");
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy is invoke");
if (myReceiver != null) {
unregisterReceiver(myReceiver);
}
}
}
第一步:写实体类继承自BroadcastReceiver;
第二步:在oncreate的时候注册广播,在ondestory的时候注销广播;这里写得不太对,因为在异常情况下,可能activity不会执行到ondestory、oncreate等方法。所以注册和注销更适合放在onresume、onpause中。
第三步:在适当的时候发送广播。
广播本身也运行在主线程中,所以千万注意不能在广播的onReceive方法中做任何耗时的操作。
比如监听音量变化的通知:intentFilter.addAction("android.media.VOLUME_CHANGED_ACTION");
各种系统广播都可以使用此种方式,不用发送广播就可直接监听到系统的各种信息变化。