注册:
动态注册的优点是可以实现灵活的广播注册和注销,但缺点就是必须要程序启动后才能接收到广播。如果想要在程序未启动时,比如刚开机的情况下接受到系统的开机广播,那就需要使用静态注册,但静态注册长期监听,消耗更多资源,因此大部分情况建议优先使用动态注册解决问题。
静态注册:
首先写一个广播接收器,继承自BroadcastReceiver类
package com.example.administrator.broadcastdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getStringExtra("info"),Toast.LENGTH_SHORT).show();
}
}
AndroidManifest.xml
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!-- 静态注册广播 -->
<!-- intent过滤器,指定可以匹配哪些intent, 一般需要定义action 可以是自定义的也可是系统的 -->
<intent-filter>
<!--action-->
<action android:name="com.broadcast.test" />
</intent-filter>
</receiver>
MainActivity.class
package com.example.administrator.broadcastdemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//静态注册广播
Intent intent=new Intent();
//与清单文件的receiver的anction对应
intent.setAction("com.broadcast.test");
intent.putExtra("info","测试静态注册广播");
//发送广播
sendBroadcast(intent);
}
}
动态注册:
package com.example.administrator.broadcastdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class DynamicReceiver extends BroadcastReceiver {
public DynamicReceiver () {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getStringExtra("name"),Toast.LENGTH_SHORT).show();
}
}
Main2Activity.class
package com.example.administrator.broadcastdemo;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
public class Main2Activity extends AppCompatActivity {
DynamicReceiver dynamicReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//动态注册广播
dynamicReceiver = new DynamicReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.broadcast.test2");
registerReceiver(dynamicReceiver, intentFilter);
//发送信息
Intent intent=new Intent();
intent.setAction("com.broadcast.test2");
intent.putExtra("name", "动态注册广播");
sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除广播
unregisterReceiver(dynamicReceiver);
}
}
AndroidManifest.xml
<receiver
android:name=".DynamicReceiver"
android:enabled="true"
android:exported="true">
</receiver>
1)静态注册:在AndroidManifest.xml注册,android不能自动销毁广播接收器,也就是说当应用程序关闭后,还是会接收广播。
2)动态注册:在代码中通过registerReceiver()手工注册.当程序关闭时,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。
android:enabled:
这个属性用于定义系统是否能够实例化这个广播接收器,如果设置为true,则能够实例化,如果设置为false,则不能被实例化。默认值是true。
<application>元素有它自己的enabled属性,这个属性会应用给应用程序的所有组件,
包括广播接收器。<application>和<receiver>元素的这个属性都必须是true,这个广播接收器才能够被启用。如果有一个被设置为false,该广播接收器会被禁止实例化。
android:exported:
这个属性用于指示该广播接收器是否能够接收来自应用程序外部的消息,如果设置true,则能够接收,如果设置为false,则不能够接收。如果设置为false,这该接收只能接收那些由相同应用程序组件或带有相同用户ID的应用程序所发出的消息。