安卓:广播BroadcastReceiver的使用

一。最简单的静态注册广播

1.创建一个继承BroadcastReceiver的类(广播的接收者)

2.在清单文件中注册广播:<receiver   android:name="包名+.继承BroadcastReceiver的类的类名"></receiver>

3.主逻辑代码文件中创建一个Intent,然后发送广播:   sendBroadcast(intent);


主逻辑代码文件:

<span style="font-size:18px;">package com.example.day21_broadreceiver;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

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


   public void send(View v)
   {
	   Intent intent=new Intent(MainActivity.this,MyBroad.class);
	  
	   sendBroadcast(intent);
   }
    
}
</span>

主布局文件:

<span style="font-size:18px;"><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=".MainActivity" >

    <Button
        android:onClick="send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送广播" />

</RelativeLayout>
</span>


广播接收方:

<span style="font-size:18px;">package com.example.day21_broadreceiver;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.widget.Toast;

public class MyBroad extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		Toast.makeText(context, "您有新的消息",0).show();
	}

}
</span>

清单文件中的<application></application>标签内:

 <receiver
            android:name="com.example.day21_broadreceiver.MyBroad">

</receiver>                                            <完>




二。隐式意图实现的发送广播,并给(静态注册的)广播设置优先级


1.创建两个继承BroadcastReceiver的类,用来接收广播

2.清单文件中注册广播,并设置意图和优先级,添加动作:

         <receiver   android:name="com.example.day21_broadreceiver2.BoradReceiver3">
            <intent-filter android:priority="4">
                  <action android:name="com.wsx"/>
            </intent-filter>
        </receiver>

3.主逻辑代码中创建Intent,设置动作,传送内容,发送广播

4.继承BroadcastReceiver的类中接收广播内容



逻辑代码文件:

<span style="font-size:18px;">package com.example.day21_broadreceiver2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void send(View v)
    {
    	Intent intent=new Intent();
    	intent.putExtra("str","您好");
    	intent.setAction("com.wsx");
    	sendBroadcast(intent);
    }

    
}
</span>

主布局文件:

<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=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="隐式意图发送广播(附带内容和优先级)" 
        android:onClick="send"/>

</RelativeLayout>

继承 BroadcastReceiver 的类 (里面内容一样,这里只写一个):

package com.example.day21_broadreceiver2;

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

public class BoradReceiver1 extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String str=intent.getStringExtra("str");
		Toast.makeText(context, "==000=="+str, 0).show();
		
	}

}

清单文件里<application></application>标签中:

       <receiver
            android:name="com.example.day21_broadreceiver2.BoradReceiver2">
            <intent-filter android:priority="12">
                <action android:name="com.wsx"/>
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.example.day21_broadreceiver2.BoradReceiver3">
            <intent-filter android:priority="4">
                <action android:name="com.wsx"/>
            </intent-filter>
        </receiver>

                                                                              <完>


三。动态注册广播



1.创建两个继承BroadcastReceiver的类,用来接收广播

2.主逻辑代码中,得到继承BroadcastReceiver的类的对象:    BoradReceiver1 receiver1=new BoradReceiver1();

3.主逻辑代码中onCreate方法里创建意图过滤,设置动作,注册广播:

        IntentFilter filter=new IntentFilter();
        filter.addAction("mars.wsx");
        registerReceiver(receiver1, filter);

4.主逻辑代码中,按钮事件里隐式意图发送广播

5.主逻辑代码中onStop方法里可取消广播注册:        unregisterReceiver(receiver1);



主逻辑代码文件:

package com.example.day21_broadreceiver2;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

	BoradReceiver1 receiver1=new BoradReceiver1();
    BoradReceiver2 receiver2=new BoradReceiver2();
    BoradReceiver3 receiver3=new BoradReceiver3();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建意图过滤
        IntentFilter filter=new IntentFilter();
        filter.addAction("mars.wsx");
        registerReceiver(receiver1, filter);
        registerReceiver(receiver2, filter);
        registerReceiver(receiver3, filter);
    }
    @Override
    protected void onStop() {
    	super.onStop();
    	//取消广播注册
    	unregisterReceiver(receiver1);
    	unregisterReceiver(receiver2);
    	unregisterReceiver(receiver3);
    }
    public void send(View v)
    {
    	Intent intent=new Intent();
    	intent.putExtra("str","您好");
    	intent.setAction("mars.wsx");
    	sendBroadcast(intent);
    }
    
    
}



布局文件:

<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=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="动态注册广播" 
        android:onClick="send"/>

</RelativeLayout>

继承BroadcastReceiver的类文件:

package com.example.day21_broadreceiver2;

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

public class BoradReceiver1 extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String str=intent.getStringExtra("str");
		Toast.makeText(context, "==000=="+str, 0).show();
		
	}

}

                                                                       <完>



前3种都是发送普通广播,不能中断:sendBroadcast();

发送有序广播可以中断:sendOrderedBroadcast();

四。发送有序广播及广播截断



1.主逻辑代码文件按钮的监听事件中创建隐式Intent,设置动作,发送有序广播

2.创建3个继承BroadcastReceiver的类,都接收广播,弹出toast

3.在清单文件中注册广播,添加意图并分别设置优先级,1最高,3第二,2最低,设置动作

4.继承BroadcastReceiver的类1中写个通知,当收到广播时弹出通知

5.继承BroadcastReceiver的类3中添加一个中断广播的操作

6.写个Activity用作打开通知的详情页,取消通知

7.清单文件中注册Activity设置动作及动作的描述                                                                        隐式意图时广播的注册不需要动作描述,但类不行



主逻辑代码文件:

<span style="font-size:18px;">package com.example.day21_broadreceiver4;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
    }
    public void send(View v)
    {
    	Intent intent=new Intent();
    	intent.putExtra("str","像疯了一样");
    	intent.setAction("hello.wsx");
    	sendOrderedBroadcast(intent, null);
    }
}
</span>


主布局文件:

<span style="font-size:18px;"><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=".MainActivity" >

    <Button 
        android:onClick="send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送有序广播" />

</RelativeLayout>
</span>

第一个继承BroadcastReceiver的类文件:

<span style="font-size:18px;">package com.example.day21_broadreceiver4;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.widget.Toast;

public class MyBoradReceiver1 extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String s=intent.getStringExtra("str");
		Toast.makeText(context,"==1111:优先级最高=="+s, 0).show();
		NotificationCompat.Builder builder=new NotificationCompat.Builder(context);
		builder.setContentTitle("来广播了");
		builder.setContentText("广播内容:"+s);
		builder.setSmallIcon(R.drawable.ic_launcher);
		builder.setWhen(System.currentTimeMillis());
		
		Intent in=new Intent();
		in.setAction("second.com");
		PendingIntent pi=PendingIntent.getActivity(context, 1, in, PendingIntent.FLAG_ONE_SHOT);
		builder.setContentIntent(pi);
		
		NotificationManager manager=(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
		manager.notify(1,builder.build());
					
	}

}
</span>


第二个继承BroadcastReceiver的类文件:

<span style="font-size:18px;">package com.example.day21_broadreceiver4;

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

public class MyBoradReceiver2 extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String s=intent.getStringExtra("str");
		Toast.makeText(context,"==2222:优先级最低=="+s, 0).show();
		
	}

}
</span>


第三个继承BroadcastReceiver的类文件:

<span style="font-size:18px;">package com.example.day21_broadreceiver4;

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

public class MyBoradReceiver3 extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		String s=intent.getStringExtra("str");
		Toast.makeText(context,"==3333:优先级第二=="+s, 0).show();
		//中断广播,据优先级应是,1收到广播后,3收,最后2收,由于3发出了中断操作,即2不会收到广播
		abortBroadcast();
	}

}
</span>


第二个Activity逻辑代码文件:

<span style="font-size:18px;">package com.example.day21_broadreceiver4;

import android.os.Bundle;
import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.view.Menu;

public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		manager.cancel(1);
	}
}
</span>

第二个Activity布局文件:

<span style="font-size:18px;"><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=".SecondActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="通知详情页" />

</RelativeLayout>
</span>


清单文件中添加:

<span style="font-size:18px;">        <receiver android:name="com.example.day21_broadreceiver4.MyBoradReceiver1" >
            <intent-filter android:priority="31" >
                <action android:name="hello.wsx" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.day21_broadreceiver4.MyBoradReceiver2" >
            <intent-filter android:priority="2" >
                <action android:name="hello.wsx" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.day21_broadreceiver4.MyBoradReceiver3" >
            <intent-filter android:priority="13" >
                <action android:name="hello.wsx" />
            </intent-filter>
        </receiver>

        <activity
            android:name="com.example.day21_broadreceiver4.SecondActivity">
            <intent-filter>
                <action android:name="second.com"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity></span>
                                                                                                                                                                 <完>



以下是系统广播:

五。系统广播----拨打电话

安装APP后当拨打电话时弹出toast如下:图中黄色圈的部分




1.创建一个继承BroadcastReceiver的类,获取打电话时电话号:

                Bundle bundle=intent.getExtras();
                String num=bundle.getString(Intent.EXTRA_PHONE_NUMBER);

2.清单文件中添加允许拨打电话的权限,然后注册广播,添加意图过滤,设置拨打电话的系统动作

                              权限:    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

                              动作:  <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>


继承BroadcastReceiver的类文件:

<span style="font-size:18px;">package com.example.day21_broad_call;

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

public class MyBoradReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		if(intent!=null)
		{
			Bundle bundle=intent.getExtras();
			String num=bundle.getString(Intent.EXTRA_PHONE_NUMBER);
			Toast.makeText(context, "拨打的电话是:"+num, 1).show();
		}
		
	}

}
</span>

清单文件添加:

<span style="font-size:18px;"><receiver
            android:name="com.example.day21_broad_call.MyBoradReceiver">
            <intent-filter>
                <!-- 系统拨打电话的动作 -->
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver></span>

及权限:
<span style="font-size:18px;">	<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
</span>

                                                                                                                                                            <完>



六。系统广播----接听,挂断电话的状态

                       


1.创建一个继承BroadcastReceiver的类

2.得到电话管理者对象,电话状态,根据状态判断

3.清单文件中添加读取电话状态的权限,注册广播,添加意图过滤,设置系统电话状态的动作


继承BroadcastReceiver的类文件:

package com.example.day21_broad_callstate;

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

public class MyBroadReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		//得到电话管理者对象
		TelephonyManager manager=(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
		//得到电话状态
		int state=manager.getCallState();
		//得到上个Activity附带的额外数据
		Bundle bundle=intent.getExtras();
		//获取当前拨打电话的号码
		String num=bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
		switch(state)
		{
		//挂断状态
		case TelephonyManager.CALL_STATE_IDLE:
			Toast.makeText(context, "挂断", 1).show();
			break;
		//接听状态
		case TelephonyManager.CALL_STATE_OFFHOOK:
			Toast.makeText(context, "接听", 1).show();
			break;
		//响铃状态
		case TelephonyManager.CALL_STATE_RINGING:
			Toast.makeText(context, "响铃", 1).show();
			break;
		}
				
	}

}

清单文件中添加:

      权限:    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

      广播的:

       <receiver
            android:name="com.example.day21_broad_callstate.MyBroadReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter>
        </receiver>

                                                                                                            <完>



七。系统广播----短信


1.创建一个继承BroadcastReceiver的类

2.获得Intent附带的数据,得到收到的短信。。。。

3.清单文件中添加允许接收短信的权限,注册广播,添加意图过滤,动作为接收短信广播接收器


继承BroadcastReceiver的类文件:

<span style="font-size:18px;">package com.example.day21_broad_smsinforation;

import java.text.SimpleDateFormat;
import java.util.Date;

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

public class MyBroadReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		Bundle bundle=intent.getExtras();
		//得到收到的短信
		Object pduses[]=(Object[]) bundle.get("pdus");
		for (Object pdus : pduses) {
			byte pdu[]=(byte[]) pdus;
			SmsMessage sms=SmsMessage.createFromPdu(pdu);
			//得到发送短信的号码
			String num=sms.getOriginatingAddress();
			//得到短信的内容
			String body=sms.getMessageBody();
			//得到短信的时间
			long time=sms.getTimestampMillis();
			SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
			String t=sf.format(new Date(time));
			Toast.makeText(context, "短信来自:"+num+"\n短信内容:"+body+"\n时间:"+t, 1).show();
			
		}
		
		
	}

}
</span>

清单文件中添加:

<span style="font-size:18px;"><uses-permission 
	    android:name="android.permission.RECEIVE_SMS"/>
   </span>

<span style="font-size:18px;">        <receiver
            android:name="com.example.day21_broad_smsinforation.MyBroadReceiver">
            <intent-filter>
                <!-- 接收短信广播接收器 -->
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver></span>

                                                                                                                                                                         <完>



八。系统广播----电池电量



逻辑代码文件:

package com.example.day21_broad_battery;

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

public class MainActivity extends Activity {

	MyBroadReceiver receiver=new MyBroadReceiver();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建广播的意图过滤,检测电源变化
        //参数:action标记,据此检测电源变化
        IntentFilter filter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(receiver, filter);
    
    
    }
   
}

继承 BroadcastReceiver 的类文件:

package com.example.day21_broad_battery;

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

public class MyBroadReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()))
		{
			//获取电量等级
			int level=intent.getIntExtra("level", 0);
			//获取总电量
			int total=intent.getIntExtra("scale", 0);
			//计算当前电量
			int current=(level*100)/total;
			Toast.makeText(context, "总电量:"+total+"\n当前电量:"+current, 1).show();
			
		}
		
	}

}

清单文件中:

    <uses-permission android:name="android.permission.BATTERY_STATS"/>


九。系统广播----网络连接情况


逻辑代码文件:

<span style="font-size:18px;">package com.example.day21_broad_intenet;

import android.net.ConnectivityManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.IntentFilter;
import android.view.Menu;

public class MainActivity extends Activity {

	MyBroadReceiver receiver=new MyBroadReceiver();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter=new IntentFilter();
        //检测网络变化的
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(receiver, filter);
    }
    
}
</span>

继承BroadcastReceiver的类文件:

<span style="font-size:18px;">package com.example.day21_broad_intenet;

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 MyBroadReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		//得到网络管理者对象
		ConnectivityManager manager=(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info=manager.getActiveNetworkInfo();
		if(info==null)
		{
			Toast.makeText(context, "网络异常", 0).show();	
		}
		else
		{
			if(info.isConnected())
			{
				Toast.makeText(context, "网络连接正常", 0).show();	
			}
			else
			{
				Toast.makeText(context, "网络连接超时", 0).show();	
			}
		}
	}

}
</span>

清单文件中:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值