版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshunli/article/details/83789174
广播的发送是通过意图(intent)实现的,那么广播的接收呢,使用过Broadcast Receiver来实现的。
广播分为两种,一种是标准广播,另一种是有序广播。
接收广播,我们可以动态的注册也可以静态的注册。
下面我们举一个动态注册的例子:
package com.example.sunshunli.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter = new IntentFilter();
//给intentfilter添加个action,因为当网络的缓急变化时就会发注这样的广播。
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
//注册监听
registerReceiver(networkChangeReceiver,intentFilter);
}
protected void onDestory(){
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//ConnectivityManager是一个系统服务类,专用于网络管理的。
ConnectivityManager connectivityManager =(ConnectivityManager) getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo !=null && networkInfo.isAvailable()){
Toast.makeText(context, "network is avaliable", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context, "network is not avaliable", Toast.LENGTH_SHORT).show();
}
}
}
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
上面的例子是我们动态注册监听网络的变化。
我要要监听它的变化,那么我们是不是应该有一个监听器呢,所以我们洗了一个监听器的类继承BroadcastReceiver,然后重写父类onReceive方法。当有广播到来时onReceive方法搜不会调用执行。
我们可以在模拟器的setting中找到datausage,然后每个模拟器还不一样,你看着哪里有按钮可以控制开关就行。
我的是
接下里是静态注册开机启动的例子:
package com.example.sunshunli.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class BootCompleteReceived extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
throw new UnsupportedOperationException("Not yet implemented");
}
}
<receiver
android:name=".BootCompleteReceived"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
还是要加上权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
这样我们的静态注册就完成了。
对比一下动态注册和今天注册。
1.动态注册没有在mainifest文件中进行接收器的注册,而静态的需要注册。
2.动态注册我们的action属性是通过IntentFilter类来实现的,而静态的是我们手动添加的。
上面我们做的都是系统的一些广播,接下来我们来发送自定义的广播。
这是一个标准广播
package com.example.sunshunli.broadcasttest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.sunshunli.broadcasttest.my_broadcast");
sendBroadcast(intent);
}
});
}
}
package com.example.sunshunli.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}
自己需要在mainifest文件中进行注册我们的监听器。
我们在建立一个项目,就是另一个应用程序。试试能不能接受这个广播。
package com.example.sunshunli.broadcasttest2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AnotherBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context, "receiver anotherbroadcastreceiver", Toast.LENGTH_SHORT).show();
throw new UnsupportedOperationException("Not yet implemented");
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sunshunli.broadcasttest2">
<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/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.sunshunli.broadcasttest.my_broadcast"/>
</intent-filter>
</receiver>
</application>
</manifest>
答案是肯定的,当我们点击了send按钮我们的连个项目都会有提示。
下面是我们的有序广播:
第一个项目:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sunshunli.broadcasttest">
<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/AppTheme">
<activity android:name=".MainActivity">
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.sunshunli.broadcasttest.my_broadcast"/>
</intent-filter>
</receiver>
</application>
</manifest>
package com.example.sunshunli.broadcasttest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.sunshunli.broadcasttest.my_broadcast");
sendOrderedBroadcast(intent,null);
}
});
}
}
sendOrderedBroadcast(intent,null);发送有序广播,第二个参数是与权限相关的字符串。填null就可以。
package com.example.sunshunli.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
abortBroadcast();是截断广播的。
第二个项目:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sunshunli.broadcasttest2">
<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/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.example.sunshunli.broadcasttest.my_broadcast"/>
</intent-filter>
</receiver>
</application>
</manifest>
<intent-filter android:priority="100">
是设置优先级的。
package com.example.sunshunli.broadcasttest2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
package com.example.sunshunli.broadcasttest2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AnotherBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context, "receiver anotherbroadcastreceiver", Toast.LENGTH_SHORT).show();
throw new UnsupportedOperationException("Not yet implemented");
}
}
这样的,话但是接收到后截断了,第二个就收不到了。