Android从入门到入坟(四)

1、广播简介

我们可以通过广播从而进行监控手机系统的各种状态信息

接收广播需要广播接收器 Broadcast Receiver

而广播分成两种类型

1、标准广播

Normal broadcast

这是一种异步广播 无法被截断,如果有三个接收器 则会同时发送三条广播

2、有序广播

Ordered broadcast

这是一种同步广播 可以被截断 广播发送出去后 只会有一个广播 然后随着逻辑代码再传送到另外一个广播中

2、动态注册监听网络的变化

注册广播有两种方式

1、动态注册 通过代码中执行

2、静态注册 通过Androidmainfest.xml执行

首先我们创建一个实体类 让他继承BroadcastReceive然后重写onReceive()方法

每当我们的网络发生变化时 便会触发onReceive这个方法

再onReceive这个方法中

实例化了ConnectivityManager对象 该对象是是一个系统服务类 专门用于管理网络连接

然后通过ConnectivityManager对象则会返回一个NetworkInfo参数通过该参数可以直接访问到当前网络的状态

整体代码如下

public class MainActivity extends AppCompatActivity {

    ReceiveChange receiveChange;
    IntentFilter filter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        filter=new IntentFilter();
        // 该值是网络监视器专门的值
        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        receiveChange=new ReceiveChange();
        // 注册监视器
        registerReceiver(receiveChange,filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 当活动被销毁时 取消注册监视器
        unregisterReceiver(receiveChange);
    }

    class ReceiveChange extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager manager= (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
            
            NetworkInfo networkInfo=manager.getActiveNetworkInfo();
            
            if (networkInfo!=null && networkInfo.isAvailable()){
                Toast.makeText(context,"当前网络已连接",Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(context,"当前网络已断开",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

在Androidmainfest.xml文件中打开网络权限

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

3、静态注册实现开机启动

首先我们新建一个Java类 右击选择文件夹选择Other然后再选择BroadCastReceive

即可完成广播器的创建 我们回到Androidmainfest 文件中则可以看见多了这样一条代码

		<receiver
            android:name=".BootCompLeteReceive"
            android:enabled="true"
            android:exported="true">
        </receiver>

enabled 代码是否启用广播

exported 代表是否运行该接收器能否接收到其他程序的广播

然后我们在其中添加一条

<intent-filter>
      <action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>

当系统启动时便会一条值为【android.intent.action.BOOT_COMPLETED】的广播

该方法与在程序中实例化IntentFilter一样

IntentFilter filter=new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

然后通过标签添加一条权限

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

4、自定义广播

首先创建一个实例类 用于接收广播

右击选择文件夹选择Other然后再选择BroadCastReceive

创建后 实例类中系统会自动重写onReceive的方法

并且会向Androidmainfest.xml文件中添加receiver标签 该标签上面有介绍

接收广播我们写完了

然后写发送广播

我们通过静态注册的方法再Androidmainfest.xml文件中添加一条自定义值

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

在MainActivity中通过按钮触发发送广播

Button btn=findViewById(R.id.btn_1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
     Intent intent=new Intent("abcabc");
     intent.setComponent(new ComponentName("com.example.broadcastreceive_test","com.example.broadcastreceive_test.MyBroadCastReceive"));
     sendBroadcast(intent);
     }
 });

在这里面我们通过 context中的sendBroadcast方法发送广播

5、发送有序广播

广播是一种可以跨进程通信方式

因此我们可以推断处不同的应用程序也是可以互相接受各自所定义的广播的

我们创建BroadcastReceive_Test2项目

同样我们在其中创建广播接收器 并且添加action的自定义值

我们可以在 IntentFilter标签 中添加android:priority=""属性 在其中指定接收广播的优先级顺序

然后在广播接收器中的onReceive方法中通过调用abortBroadcast()方法对广播的接收进行截断

代码如下

public class MyBroadCastReceive extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "Hello Word", Toast.LENGTH_SHORT).show();
        abortBroadcast();
    }
}

6、本地广播

本地广播也非常简单 ,该广播有效的解决了许多安全问题

1、我们首先依旧通过系统创建一个广播接收器

public class LocalBroadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "本地广播", Toast.LENGTH_SHORT).show();
    }
}

2、我们去MainActivity中注册点击事件 通过点击事件发送本地广播

本地广播由LocalBroadCastManage对进行管理

// 首先实例化LocalBroadCastManage
manager=LocalBroadcastManager.getInstance(this);
public void onClick(View view) {
       Intent intent =new Intent("Local_Broadcast"); // guang'bo
       intent.setComponent(new ComponentName("com.example.myapplication","com.example.myapplication.MyBroadCast"));
       manager.sendBroadcast(intent); // 发送广播
}
IntentFilter filter1=new IntentFilter();
        filter1.addAction("Local_Broadcast");
        // 注册广播的监听器
        localBroadcast=new LocalBroadcast(); // 实例化接收广播类
        manager.registerReceiver(localBroadcast,filter1);

 @Override
    protected void onDestroy() {
        super.onDestroy();
        manager.unregisterReceiver(localBroadcast); //取消注册广播监听器
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值