Android自定义广播(Broadcast)与系统广播

BroadcastReceiver所对应的广播分两类:无序广播和有序广播,我就来先讲讲无序广播与系统广播咯

无序广播的发送:把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()方法,把 Intent对象以广播方式发送出去。

广播的接收:接收者通过一个继承了BroadcastRecevier的类来实现,覆盖onReceive()方法并且要通过Java或XML方式注册BroadcastReceiver。

src/com/zking/shuanger_android_20/ Activity.java代码如下:

package com.zking.shuanger_android_20;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText et_main_content;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_main_content = (EditText) findViewById(R.id.et_main_content);

        intent = new Intent();

        //设置广播的名字(设置action行为) 唯一的
        intent.setAction("com.zking.shuanger_android_20.SenderContent");
    }

    /*
    * intent 是Android三大基本组件的桥梁
    * Activity 、Broadcast(广播)、service(服务)
    *
    * */


    public void send(View view){

        String content = et_main_content.getText().toString();

        //携带数据
        intent.putExtra("content",content);
        //发送广播
//        sendBroadcast(intent);


    }


}

广播事件的接受者(一个继承了BroadcastReceiver的类)

src/com/zking/shuanger_android_20_received_01/MyReceivedOne .java

package com.zking.shuanger_android_20_received_01;

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

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

/**
 * Created by Pretty Girl on 2017/2/7.
 */

public class MyReceivedOne extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if ("com.zking.shuanger_android_20.SenderContent".equals(intent.getAction())){
            String content = intent.getStringExtra("content");
            SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            Date date = new Date(System.currentTimeMillis());//获取当前时间
            String datetime = format.format(date);

            Log.i("test","No.1号接收者收到广播!"+content+"\t"+datetime);
        }


    }


}

注册广播:

通过XML方式注册BroadcastReceiver(静态广播)。
AndroidManifest.xml:
<!-- 注册广播接收者
        1、在XML中配置(静态广播)
        2、使用java 代码(动态广播)
        -->
        <receiver android:name=".MyReceivedOne">
            <!--意图过滤器-->
            <intent-filter>
                <!--配置 广播接收名 -->
                <action android:name="com.zking.shuanger_android_20.SenderContent"></action>
            </intent-filter>

        </receiver>

动态广播的接收与静态广播接收是一样的,所以就讲
通过Java代码方式注册BroadcastReceiver(动态广播)

src/com/zking/shuanger_android_20_received_02/MainActivity .java

package com.zking.shuanger_android_20_received_02;

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

public class MainActivity extends AppCompatActivity {

    private MyReceivedTwo myReceivedTwo;
    private IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myReceivedTwo = new MyReceivedTwo();
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.zking.shuanger_android_20.SenderContent");
    }



    @Override
    protected void onResume() {
        super.onResume();
    //注册广播

        registerReceiver(myReceivedTwo,intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //销毁广播
        unregisterReceiver(myReceivedTwo);
    }
}

讲完自定义广播啦!

那么就接着来讲一个系统广播的例子吧,监听手机的电话状态。

首先,写一个继承了BroadcastReceiver的类用来做测试
src/com/zking/shuanger_android_20_phonestate/MyPhoneState.java

package com.zking.shuanger_android_20_phonestate;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;

/**
 * Created by Pretty Girl on 2017/2/7.
 */

public class MyPhoneState extends BroadcastReceiver {


    private TelephonyManager telephonyManager;

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

        if ("android.intent.action.PHONE_STATE".equals(intent.getAction())){
        //获取电话号码
            String phone = intent.getStringExtra("incoming_number");
            Log.i("test","您有电话进来!\t"+phone);

            //获取电话状态
            //电话管理者
            telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

            int state = telephonyManager.getCallState();
            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;
            }
        }



    }
}

然后在AndroidManifest.xml中配置手机读取电话状态的权限以及注册广播
请看代码:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zking.shuanger_android_20_phonestate">
    <!-- 读取电话状态权限 -->
<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=".MyPhoneState">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"></action>
            </intent-filter>
        </receiver>


    </application>

</manifest>

这样就可以啦,你也快去测试测试吧!

这次的分享就先结束咯,记得关注我哦,还有更多的分享想带给您们,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值