Adroid 广播 有序和无序及短信接收和监听手机通话状态小例子

Adroid 广播 分为有序和无序广播 sendOrderBroadcast 、sendBroadcast。

一、无序广播发送方:
实例化一个Intent,用intent.setAction(设置广播名字),并且携带要发送的
数据(intent.putExtra),然后用sendBroadcast(intent)发送广播。

  intent = new Intent();
  //设置名字  
        intent.setAction("com.example.phonebroad.955");
    }
    public void send(View view){
    //获取发送的内容
        String date=mian_01.getText().toString();
        intent.putExtra("data",date);
        sendBroadcast(intent);
        //粘性广播 (也分为有序和无序 已过时,使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,10秒限制是指普通的广播如果onReceive方法执行时间太长,超过10秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。)api需要权限:<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission><application 
        //sendStickyBroadcast(intent);
    }

接收方: 需要配置广播接受者:
1.在清单文件中配置(静态广播 )

  <receiver android:name=".ReceviedActivity">
            <intent-filter>
                <action android:name="com.example.phonebroad.955"></action>
            </intent-filter>
        </receiver>
 </application>
public class ReceviedActivity extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //判断你要接收的广播的名字
        if("com.example.phonebroad.955".equals(intent.getAction())){        //接收内容
            String data=intent.getStringExtra("data");
            Log.i("hhhhhh",data);
        }
    }
     2.使用java 代码(动态广播 优先于静态广播接收)

public class Recevied2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("com.example.phonebroad.955".equals(intent.getAction())){
            String data=intent.getStringExtra("data");
            Log.i("hhhh2",data);
        }
    }
}

public class MainActivity extends AppCompatActivity {

    private Recevied2 recevied2;
    private IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recevied2 = new Recevied2();
        //意图过滤器
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.phonebroad.955");
    }
//恢复时注册
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(recevied2,intentFilter);
    }
//销毁时取消注册
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(recevied2);
    }
}

二、有序广播:
设置发送者为有序:
sendOrderedBroadcast(intent,null);
在清单文件中制定顺序一般为 -1000~1000
android:priority=”1000”
例如:短信接收者的配置 (静态)

 <receiver android:name=".MySMSReceived">
            <intent-filter
                android:priority="1000"
                >
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>

Java配置(动态)

 intentFilter = new IntentFilter();
        intentFilter.addAction("com.zking.g150831_android20_sender.955");

        intentFilter.setPriority(998);

有序广播前者接收还可以更改广播内容:


        //广播原内容
            String data=intent.getStringExtra("data");
            //改变内容
            Bundle bundle=new Bundle();
            bundle.putString("content",data+",哈哈 这是真的吗?");

            setResultExtras(bundle);
//下一个广播获取值的方式
 Bundle bundle=getResultExtras(true);
 String content=bundle.getString("content");

三、短信接收小例子:
首先还是获取短信接收的权限:

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

及配置短信接收者(上方的配置静态有序广播的代码段)


public class MySMSReceived extends BroadcastReceiver {

    private String body;

    @Override
    public void onReceive(Context context, Intent intent) {
        if("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction())){
            //获取短信的内容
            Bundle bundle=intent.getExtras();
            Object[] objects= (Object[]) bundle.get("pdus");
            SmsMessage[] smsMessages=new SmsMessage[objects.length];
            for (int i = 0; i < objects.length; i++) {               smsMessages[i]=SmsMessage.createFromPdu((byte[])objects[i]);
            }
            for (SmsMessage message : smsMessages) {
              //发送人的号码
                String address = message.getDisplayOriginatingAddress();
                //发送的内容
                body = message.getDisplayMessageBody();
            }
//根据短信内容拦截短信
            if(body.contains("中奖了")){
                //拦截                
                abortBroadcast();               
            }
        }
    }
}

四、系统广播之监听手机通话状态事件


public class PhoneActivity extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        if("android.intent.action.PHONE_STATE".equals(intent.getAction())){
            //获取电话号码
            String number=intent.getStringExtra("incoming_number");
            Log.i("phone","大胡子:"+number);
            //电话管理者
            TelephonyManager tm= (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            //来电状态
            int state=tm.getCallState();
            //3个状态
            switch (state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.i("test","响铃");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.i("test","接通");
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.i("test","挂断");
                    break;
            }
        }
    }
}
**配置权限及通话状态接收接受者**

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

    <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">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".PhoneActivity">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"></action>
            </intent-filter>
        </receiver>
    </application>

“合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。“

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值