在 Android 应用中,广播是一种常用的消息传递机制。 Android 框架提供了多个标准广播,如网络状态变化、电量变化、时间变化等,在需要的时候我们可以注册这些广播,接收对应的事件。
除了使用标准广播,应用还可以自定义广播,达到应用内部通信的目的。在本篇文章中,我们将会如何创建自定义广播、如何发送广播和如何接收广播。
一、广播创建
创建自定义广播需要以下两个步骤:
1. 创建自定义的 BroadcastReceiver 清单文件
<receiver android:name=".MyReceiver" android:exported="false"> <intent-filter> <action android:name="com.example.mybroadcast.TEST" /> </intent-filter> </receiver>
2. 创建 BroadcastReceiver 类并实现相应逻辑
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 收到广播后执行的逻辑 Toast.makeText(context, "收到自定义广播", Toast.LENGTH_SHORT).show(); } }
在这个例子中,我们创建了一个 MyReceiver 类,并在清单文件中声明了它。声明的内容包括名字、广播的 actions 和条件,以及是否允许其他应用程序接收此广播。
在 MyReceiver 类中,我们实现了 onReceive() 方法,该方法会在广播接收到时被调用。在这个例子中,我们只为收到广播后显示一个简单的 Toast 消息。
二、广播发送
发送广播需要创建一个 Intent 对象,并在广播发送前设置相关属性,包括我们上面创建的广播的 actions 和数据(可选)。
Intent intent = new Intent("com.example.mybroadcast.TEST"); intent.putExtra("test_data", "Test data"); sendBroadcast(intent);
在这个例子中,我们创建了一个 Intent 对象,并设置了 actions 和数据。通过调用 sendBroadcast() 方法可以将广播发送到系统,系统会将广播传递给所有注册了这个广播的 BroadcastReceiver。
三、广播接收
接收广播需要创建一个 BroadcastReceiver 对象,并在其 onReceive() 方法中添加我们的逻辑。
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = intent.getStringExtra("test_data"); // 收到广播后执行的逻辑 Toast.makeText(context, "收到自定义广播,数据为:" + data, Toast.LENGTH_SHORT).show(); } }
在这个例子中,我们在 onReceive() 方法中获取我们发送的数据,并将其用于逻辑的执行。这里,我们将接收到的数据显示在 Toast 消息中。
四、总结
通过本篇文章,我们已经学会了如何自定义广播,并在应用内部进行通信。自定义广播能够使我们更好的来处理应用内部的信息传递,在我们的应用中,我们可以利用广播来实现许多功能,如应用内部状态的同步和信息传递。
关于本文的完整代码示例:
清单文件内容:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mybroadcast"> <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"> <receiver android:name=".MyReceiver" android:exported="false"> <intent-filter> <action android:name="com.example.mybroadcast.TEST" /> </intent-filter> </receiver> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
MainActivity 类的内容:
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_send); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.mybroadcast.TEST"); intent.putExtra("test_data", "Test data"); sendBroadcast(intent); } }); } }
MyReceiver 类的内容:
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = intent.getStringExtra("test_data"); // 收到广播后执行的逻辑 Toast.makeText(context, "收到自定义广播,数据为:" + data, Toast.LENGTH_SHORT).show(); } }