android 广播

由于昨天有人问我广播的问题,当时我也有点忘记了,特地来写篇博客记录一下。

发送广播:
一、标准广播

在广播发送出去后,所有的广播接收器都能同时接收这条广播。

        Intent intent = new Intent("com.example.android_broadcast");
        sendBroadcast(intent);

二、有序广播:

在广播发送出去后,只有一个广播接收器能先接收这条广播,当这个广播接收器处理完成后,广播才继续发送出去,如此继续下去。

		Intent intent = new Intent("com.example.android_broadcast");
		sendOrderedBroadcast(intent, null);
		// sendOrderedBroadcast()方法接收两个参数,第一个参数仍然是Intent,第二个参数是一个与权限相关的字符串,这里传入null就行了。

接收广播:

接收广播的时候,我们必须注册才能接收广播,我们可以在代码里注册(动态接收)也可以在 AndroidManifest.xml 中注册(静态接收)。

代码里注册(动态接收):这种注册的接收必须在程序启动后才能接收广播,而且这种注册可以灵活控制注册与注销。

AndroidManifest.xml 中注册(静态接收):这种注册的接收可以在程序不启动的情况下接收广播。

一、动态接收:

新建一个Mybroadcastreceiver类继承BroadcastReceiver,当Mybroadcastreceiver接收到相对应的广播时, onReceive()方法就会得到执行。

package com.example.android_broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class Mybroadcastreceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		// 处理相关逻辑
	}

}


package com.example.android_broadcast;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

public class MainActivity extends Activity {
	
	private Mybroadcastreceiver mybroadcastreceiver;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//创建intentFilter实例并添加action
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction("com.example.android_broadcast");
		//创建Mybroadcastreceiver实例
		mybroadcastreceiver = new Mybroadcastreceiver();
		//调用 registerReceiver()方法进行注册,使得mybroadcastreceiver接收"com.example.android_broadcast"广播
		registerReceiver(mybroadcastreceiver, intentFilter);
		Intent intent = new Intent("com.example.android_broadcast");
		sendBroadcast(intent, null);
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		//注销广播
		unregisterReceiver(mybroadcastreceiver);
	}
}


二、静态接收:

AndroidManifest.xml中添加代码:

        <receiver android:name=".Mybroadcastreceiver" >
            <intent-filter>
                <action android:name="com.example.android_broadcast" />
            </intent-filter>
        </receiver>

三、有序接收:

AndroidManifest.xml中添加代码:通过 android:priority 属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。

有序接收只能静态注册。

        <receiver
            android:name=".Mybroadcastreceiver"
            android:permission="100" >
            <intent-filter>
                <action android:name="com.example.android_broadcast" />
            </intent-filter>
        </receiver>


### 广播机制概述 Android广播是一种系统级的消息传递机制,用于在应用程序之间或系统与应用程序之间发送和接收事件通知。通过广播,应用可以监听并响应特定的系统事件(如设备启动完成、电池电量低等)或其他应用发出的自定义事件。 广播分为两种类型:**有序广播**和**粘滞广播**。有序广播允许接收者按照优先级顺序依次处理广播消息,而粘滞广播则是在广播发送后注册的接收者仍然能够接收到该广播。 #### 注册广播接收器 广播接收器可以通过两种方式注册:静态注册和动态注册。 - **静态注册**:在`AndroidManifest.xml`文件中声明广播接收器。这种方式适用于需要长期运行的广播接收器,即使应用未启动也能接收到广播。 ```xml <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.MY_ACTION" /> </intent-filter> </receiver> ``` - **动态注册**:在代码中使用`registerReceiver()`方法注册广播接收器。这种方式适用于需要在特定条件下才启用的广播接收器,且在不再需要时应调用`unregisterReceiver()`方法注销。 ```java IntentFilter filter = new IntentFilter("com.example.MY_ACTION"); registerReceiver(myBroadcastReceiver, filter); ``` #### 发送广播 发送广播可以通过`sendBroadcast()`方法实现,传入一个`Intent`对象指定广播的动作和其他数据。 ```java Intent intent = new Intent("com.example.MY_ACTION"); intent.putExtra("data", "Hello World"); sendBroadcast(intent); ``` 对于有序广播,可以使用`sendOrderedBroadcast()`方法,并指定一个权限字符串来限制哪些应用可以接收此广播。 ```java sendOrderedBroadcast(intent, null); ``` ### 使用场景示例 #### 系统广播 系统广播Android系统自动发出的广播,例如当设备启动完成后会发出`ACTION_BOOT_COMPLETED`广播。开发者可以在应用中注册这些广播以执行相应的操作。 ```xml <receiver android:name=".BootCompletedReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> ``` #### 自定义广播 除了系统广播外,开发者还可以创建自己的广播,以便在应用内部或不同应用间传递信息。 ```java Intent intent = new Intent("com.example.CUSTOM_ACTION"); intent.putExtra("message", "This is a custom broadcast"); sendBroadcast(intent); ``` ### 注意事项 - **权限管理**:发送或接收某些广播可能需要特定的权限。在`AndroidManifest.xml`中声明所需的权限,或者在运行时请求权限。 ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> ``` - **性能优化**:避免在广播接收器中执行耗时的操作,因为这可能会导致主线程阻塞。如果需要执行长时间任务,建议启动一个服务或使用异步任务。 - **安全性**:确保广播的安全性,防止恶意应用滥用。可以通过设置权限或使用本地广播(LocalBroadcastManager)来限制广播的作用范围。 ### 示例代码 以下是一个简单的广播接收器实现,用于接收并处理自定义广播: ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if ("com.example.CUSTOM_ACTION".equals(action)) { String message = intent.getStringExtra("message"); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } } } ``` 在活动中注册和注销广播接收器: ```java private MyBroadcastReceiver myBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter("com.example.CUSTOM_ACTION"); registerReceiver(myBroadcastReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(myBroadcastReceiver); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值