接收系统广播
动态注册监听网络变化
首先需要创建一个广播接收器:新建类继承BroadcastReceiver,并重写onReceiver()方法。
然后通过动态注册的方式编写一个能够监听网络变化的程序。
最后申请权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
public class BroadcastTest extends AppCompatActivity {
private IntentFilter intentFilter;
private MyBroadcastReceiver myBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_test);
intentFilter = new IntentFilter();//构建意图
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//添加行为
myBroadcastReceiver = new MyBroadcastReceiver();
registerReceiver(myBroadcastReceiver, intentFilter);//注册
}
@Override
protected void onDestroy() {//取消注册
super.onDestroy();
unregisterReceiver(myBroadcastReceiver);
}
class MyBroadcastReceiver extends BroadcastReceiver {//广播接收器
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onReceive(Context context, Intent intent) {
//Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Network networks = manager.getActiveNetwork();
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(networks);
if (networkCapabilities != null) {
Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
}
}
}
}
注意:动态注册的广播接收器一定都要取消注册才行,这里在onDestory()方法中调用unregisterReceiver()方法来实现的。
静态注册实现开机启动
首先还是创建广播接收器:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
}
}
然后在AndroidManifest.xml文件中静态注册:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.holidaytest">
//申请 监听系统开机广播 权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HolidayTest">
...
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
//添加想要监听的广播
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
发送自定义广播
发送标准广播
首先创建广播接收器:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}
然后在AndroidManifest.xml文件中设置广播接收器需要接受的广播:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.holidaytest">
...
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HolidayTest">
...
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
</application>
</manifest>
最后定义一个按钮发送标准广播:
public class BroadcastTest extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_test);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
}
}
首先构建Intent将要发送的广播的值传入,然后调用Context的sendBroadcast() 方法将广播发送出去,这样所有监听这条广播的广播接收器就会收到消息。
发送有序广播
首先创建新项目,然后再创建一个广播接收器:
public class AnotherMyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
//abortBroadcast();如果调用此方法,就表示将这条广播截断,后面的广播接收器无法再接收这条广播
}
}
接收标准广播发出的广播(不同程序之间接收广播):
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.holidaytest">
...
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HolidayTest">
...
<receiver android:name=".AnotherMyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">//设置接收广播的优先级
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
</application>
</manifest>
发送有序广播:
public class BroadcastTest extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_test);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent, null);
}
});
}
}
发送有序广播只需将sendBroadcast()方法改为sendOrderedBroadcast() 方法