安卓学习UI组件-广播接收器-BroadcastReceiver

本文深入探讨了Android应用中的广播机制,包括普通广播、有序广播、粘性广播等类型,并通过实例展示了如何实现动态注册广播接收器、发送不同类型的广播以及在不同场景下广播的应用,如实时电量显示、开机启动、网络状态变化、电量监测等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

image

image

Q`1XOLHTUY18AEJH}}APUO3

G_MF7DP21SCXCM`EJ2$28W5

7(C($Q(NHFI(@OZ4C0)4}JV

~$N$7}NZK[0N%FG8TL~M4FP

M(PB32B8TPEYY40J4LG8B~6

L2B29Q4$PB}Q}Q[4F%{%$(Q

%0L9(XL4X`_O(ZNU5M02JAE

QK8J6@`IX4L44XA6NC7}YOJ

GD%3N$N06766AKN]G6X6PJ1

PRF$0M~R7BM8MH{9BXE7O3V

27J)~WZR5M{}})DH{NB~J[G

image

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.MainActivity">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送一个普通广播"
android:id="@+id/button_normal"
android:onClick="sendNormalClick"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送一个有序广播"
android:onClick="sendOrderClick"
android:id="@+id/button_order"
android:layout_below="@+id/button_normal"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button_normal"
android:layout_alignEnd="@+id/button_normal" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送一个粘性广播"
android:id="@+id/button"
android:onClick="sendStickyClick"
android:layout_below="@+id/button_order"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button_order"
android:layout_alignEnd="@+id/button_order" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动接收粘性广播的Activity"
android:id="@+id/button2"
android:onClick="openStickyActivityClick"
android:layout_below="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button" />
</RelativeLayout>

MainActivity.java

package com.example.administrator.myapplication;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

private MyReceiver2 receiver2 = new MyReceiver2();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

//在该方法中进行广播注册
@Override
protected void onResume() {
//运行完可以交互
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction("com.codingke.action.MY_BROADCAST");
registerReceiver(receiver2, filter);

//立即获取当前电量
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.intent.action.BATTERY_CHANGED");
Intent batteryIntent=getApplicationContext().registerReceiver(null,intentFilter);
int curr=batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);//当前电量
int total=batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE,1);//总电量
int percent=curr*100/total;
Toast.makeText(this, "当前电量为" + percent, Toast.LENGTH_SHORT).show();

}

//该方法中解除广播注册
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver2);
}

//发送一个普通的广播
public void sendNormalClick(View v) {
Intent intent = new Intent("com.codingke.action.MY_BROADCAST");
intent.putExtra("info", "我们很有缘,终于对接了!");
this.sendBroadcast(intent);
}
// 发送一个有序广播
public void sendOrderClick(View v) {
Intent intent=new Intent("com.codingke.action.MY_BROADCAST2");
//参数:intent,接收权限
this.sendOrderedBroadcast(intent, null);
}
//发送一个粘性广播
public void sendStickyClick(View v)
{
Intent intent=new Intent("com.codingke.action.MY_BROADCAST3");
this.sendStickyBroadcast(intent);
}
public void openStickyActivityClick(View v)
{
Intent intent=new Intent(this,MainActivity2.class);
startActivity(intent);
}

}

 

MyReceiver1.java--普通广播

<receiver
android:name=".MyReceiver1"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.codingke.action.MY_BROADCAST" />
</intent-filter>
</receiver>
package com.example.administrator.myapplication;

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

/*自定义的广播接收器*/
public class MyReceiver1 extends BroadcastReceiver {
public MyReceiver1() {
}
//运行接收的方法 同一个程序应用里
@Override
public void onReceive(Context context, Intent intent) {
String info=intent.getStringExtra("info");
Toast.makeText(context,info,Toast.LENGTH_SHORT).show();
}
}

MyReceiver2.java--普通广播

package com.example.administrator.myapplication;

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

public class MyReceiver2 extends BroadcastReceiver {
public MyReceiver2() {
}

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"动态注册的广播接收器",Toast.LENGTH_SHORT).show();
}
}
 
注册代码在MainActivity,动态注册
IntentFilter filter = new IntentFilter();
filter.addAction("com.codingke.action.MY_BROADCAST");
registerReceiver(receiver2, filter);


 

MyReceiver3.java--有序广播--设置优先级priority

<receiver
android:name=".MyReceiver3"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="com.codingke.action.MY_BROADCAST2" />
</intent-filter>
</receiver>
package com.example.administrator.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class MyReceiver3 extends BroadcastReceiver {
public MyReceiver3() {
}

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"有序广播-1",Toast.LENGTH_SHORT).show();

//给下一个广播传递Bundle
Bundle data=new Bundle();
data.putString("info","流离之人追逐幻影,广播-1");
this.setResultExtras(data);
//中断有序广播,只有有序广播能中断,
// this.abortBroadcast();
}
}

MyReceiver4.java--有序广播

<receiver
android:name=".MyReceiver4"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="200">
<action android:name="com.codingke.action.MY_BROADCAST2" />
</intent-filter>
</receiver>
package com.example.administrator.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class MyReceiver4 extends BroadcastReceiver {
public MyReceiver4() {
}

@Override
public void onReceive(Context context, Intent intent) {

Bundle data= getResultExtras(false);
String info=data.getString("info");
Toast.makeText(context, "有序广播-2--"+info, Toast.LENGTH_SHORT).show();
}
}

MyReceiver5.java--粘性广播

清单文件权限:
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
package com.example.administrator.myapplication;

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

public class MyReceiver5 extends BroadcastReceiver {
public MyReceiver5() {
}

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"接收一个粘性的广播",Toast.LENGTH_SHORT).show();
}
}
 

MainActivity2.java

package com.example.administrator.myapplication;

import android.content.IntentFilter;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

public class MainActivity2 extends ActionBarActivity {

private MyReceiver5 receiver5 =new MyReceiver5();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}

@Override
protected void onResume() {
super.onResume();
IntentFilter filter=new IntentFilter("com.codingke.action.MY_BROADCAST3");
registerReceiver(receiver5,filter);

}

@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver5);
}
}

MyReceiver6.java--开机广播

清单文件权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name=".MyReceiver6"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
package com.example.administrator.myapplication;

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

public class MyReceiver6 extends BroadcastReceiver {
public MyReceiver6() {
}

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"开机啦",Toast.LENGTH_SHORT).show();
}
}

MyReceiver7.java--网络状态改变广播

清单文件权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<receiver
android:name=".MyReceiver7"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
package com.example.administrator.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

/*网络状态改变*/
public class MyReceiver7 extends BroadcastReceiver {
public MyReceiver7() {
}

@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager cm= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info= cm.getActiveNetworkInfo();//活动的网络信息
if (info!=null)
{
String name=info.getTypeName();
Toast.makeText(context,name,Toast.LENGTH_SHORT).show();
}

}
}

MyReceiver8.java--(1)监测电量变化广播(2)立刻获取电量

(1)

清单文件:

<receiver
android:name=".MyReceiver8"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED"></action>

</intent-filter>
</receiver>
package com.example.administrator.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.BatteryManager;
import android.widget.Toast;

//监测电量变化
public class MyReceiver8 extends BroadcastReceiver {
public MyReceiver8() {
}

@Override
public void onReceive(Context context, Intent intent) {
int curr=intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);//当前电量
int total=intent.getIntExtra(BatteryManager.EXTRA_SCALE,1);//总电量
int percent=curr*100/total;
Toast.makeText(context,"当前电量为"+percent,Toast.LENGTH_SHORT).show();

}
}

(2)

在MainAvtivity.java 的onResume方法中

//立即获取当前电量
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.intent.action.BATTERY_CHANGED");
Intent batteryIntent=getApplicationContext().registerReceiver(null,intentFilter);
int curr=batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);//当前电量
int total=batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE,1);//总电量
int percent=curr*100/total;
Toast.makeText(this, "当前电量为" + percent, Toast.LENGTH_SHORT).show();

 

AndroidMainifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.myapplication">

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<receiver
android:name=".MyReceiver1"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.codingke.action.MY_BROADCAST" />
</intent-filter>
</receiver>
<!--
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true"></receiver>
-->
<receiver
android:name=".MyReceiver3"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="com.codingke.action.MY_BROADCAST2" />
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver4"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="200">
<action android:name="com.codingke.action.MY_BROADCAST2" />
</intent-filter>
</receiver>

<activity android:name=".MainActivity2" />

<receiver
android:name=".MyReceiver6"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver7"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver8"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED"></action>

</intent-filter>
</receiver>
</application>

</manifest>

转载于:https://my.oschina.net/xiaofeiandroid/blog/648647

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值