Android广播receiver

本文详细介绍了Android中的广播机制,包括如何使用系统广播监听电话拨打、应用安装与卸载等事件,以及如何实现自定义广播的发送与接收。此外,还探讨了无序广播与有序广播的区别,并展示了如何通过代码动态配置广播接收器。

Android广播receiver

    安卓四大组件之一接受者receiver是安卓必不可少的组成部分。

广播接收者BroadcastReceiver的运用

系统广播

    创建一个自己的CallBroadcastReceiver继承BroadcastReceiver,然后在onReceive(Context context,Intent intent)方法中去接收广播。

    

	public void onReceive(Context context, Intent intent) {
		abortBroadcast();//中断广播
		String action = intent.getAction();
		if( "android.intent.action.NEW_OUTGOING_CALL".equals(action) ){
			String resultData = getResultData();
			if( "123".equals(resultData) ){
				setResultData("456");
			}
			System.out.println(resultData);
			Toast.makeText(context, "call", Toast.LENGTH_SHORT).show();
		}else if("android.intent.action.PACKAGE_INSTALL".equals(action)){
			System.out.println("PACKAGE_INSTALL");
			Toast.makeText(context, "PACKAGE_INSTALL", Toast.LENGTH_SHORT).show();
		}else if("android.intent.action.PACKAGE_ADDED".equals(action)){
			System.out.println("PACKAGE_ADDED");
			Toast.makeText(context, "PACKAGE_ADDED", Toast.LENGTH_SHORT).show();
			
			Intent intent2 = new Intent();
			intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent2.setClass(context,MainActivity.class);
			context.startActivity(intent2);
		}else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
			System.out.println("PACKAGE_REMOVED");
			Toast.makeText(context, "PACKAGE_REMOVE", Toast.LENGTH_SHORT).show();
		}
	}

获取广播事件action,然后判断广播事件,执行广播事件之后的相应代码。

打电话事件之后获取电话号码,输出号码名字,如果号码是123,就打给456。

然后再测试安装与卸载app的广播事件,安装的action是android.intent.action.PACKAGE_ADDED,不是android.intent.action.PACKAGE_INSTALL,安装广播之后也执行跳转命令Intent2。

    

但仅仅写完上述代码是不够的,还要在注册清单上面添加:

        <receiver android:name="com.example.broadcastmytest.broadcast.CallBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_INSTALL"/>
                <action android:name="android.intent.action.PACKAGE_ADDED"/>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
                
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>

把包改成
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastmytest"
    android:versionCode="1"
    android:versionName="1.0" >
    

这样之后才可以运行成功。

    


自己写广播自己接收

    

无序广播

    

	public void wuxu(View v){
		showUserMsg("wuxu");
		Intent intent = new Intent();
		intent.putExtra("key1", "我是无序广播");
		intent.setAction("com.example.broadcast.SendUnOder1");
		sendBroadcast(intent);
	}
    

自己写一个类去接收自己发出的广播

public class SendUnOrderBroadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String StringExtra = intent.getStringExtra("key1");
		System.out.println("StringExtra"+StringExtra);
	}
	
}

在清单文件里面去添加一个receiver

<span style="white-space:pre">	</span><receiver android:name="com.example.broadcast.send.SendUnOrderBroadcast">
            <intent-filter>
                <action android:name="com.example.broadcast.SendUnOder1"/>
            </intent-filter>
        </receiver>


    

有序广播

写三个广播接收类,1 2 3表示权限

public class SendUnOrder1Broadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String stringExtra = intent.getStringExtra("key2");
		System.out.println("111"+stringExtra);
	}

}
<pre name="code" class="java">public class SendUnOrder2Broadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String stringExtra = intent.getStringExtra("key2");
		System.out.println("222"+stringExtra);
	}

}

public class SendUnOrder3Broadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String stringExtra = intent.getStringExtra("key2");
		System.out.println("333"+stringExtra);		
	}

}




发送广播

	public void youxu(View v){
		showUserMsg("youxu");
		Intent intent = new Intent();
		intent.putExtra("key2", "我是有序广播");
		intent.setAction("com.example.broadcast.SendUnOder2");
		sendOrderedBroadcast(intent, null, null, null, 1, null, null);
	}

清单文件内设置权限级别

        <receiver android:name="com.example.broadcast.send.oder.SendUnOrder1Broadcast">
            <intent-filter android:priority="1000">
                <action android:name="com.example.broadcast.SendUnOder2"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.broadcast.send.oder.SendUnOrder2Broadcast">
            <intent-filter android:priority="500">
                <action android:name="com.example.broadcast.SendUnOder2"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.broadcast.send.oder.SendUnOrder3Broadcast">
            <intent-filter android:priority="100">
                <action android:name="com.example.broadcast.SendUnOder2"/>
            </intent-filter>
        </receiver>

可以在广播接收类内部中断广播

abortBroadcast();



这样就可以自己发广播自己接收了。


代码动态配置广播

    

代码动态配置广播不需要在清单中配置recevier,直接在代码中创建一个registBroadcast和IntentFilter,然后往IntentFilter里面去添加action,最后代码注册一个Receiver。


在Activity的onCreate里面写

		registBroadcast = new RegistBroadcast();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction("android.intent.action.SCREEN_OFF");
		intentFilter.addAction("android.intent.action.SCREEN_ON");
		registerReceiver(registBroadcast,intentFilter);


public class RegistBroadcast extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if( "android.intent.action.SCREEN_OFF".equals(action) ){
			System.out.println("SCREEN_OFF");
		}else{
			System.out.println("SCREEN_ON");
		}
	}
	
}


    这样就可以接收屏幕关闭打开的广播了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值