zoukankan      html  css  js  c++  java
  • Android广播的使用(自定义广播和本地广播)

    1》自定义广播

    //定义接收器
    public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    Toast.makeText(context,"接收我的广播",Toast.LENGTH_LONG).show();
    }
    }
    ·//注册事件
    <receiver
    android:name=".MyBroadcastReceiver"//类名
    android:enabled="true"
    android:exported="true">
    <intent-filter>
    <action android:name="com.example.broadcasttext.MY_BROADCAST"/>广播名称
    </intent-filter>
    </receiver>
    //定义按钮发送广播

    Button button=(Button)findViewById(R.id.b1);
    button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    Intent intent=new Intent("com.example.broadcasttext.MY_BROADCAST");
    sendBroadcast(intent);
    }
    });
      
     
     

    广播在另外的程序上进行接收,默认的发送方式是标准广播,若想发送有序广播,需要一点点修改

    MainActivity.java

    button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    Intent intent=new Intent("com.example.broadcasttext.MY_BROADCAST");
    sendBroadcast(intent);
    sendOrderedBroadcast(intent,null);
    }
    });

    加入这一行代码后广播的接收就有了顺序

    注册时候可以设置接收广播的优先级

    <receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="100">
    <action android:name="com.example.broadcasttext.MY_BROADCAST"/>
    </intent-filter>
    </receiver>

    优先接收到广播后就可以判断是否继续发送广播

    public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    Toast.makeText(context,"接收我的广播",Toast.LENGTH_LONG).show();
    abortBroadcast();
    }
    }

    abortBroadcast();可以截断广播

    2》本地广播

    上述例子中发送的广播可以被其他程序所接受,这对安全造成了威胁,所以安卓引入了一套本地广播的体制

      MainActivity.java

    
    
    package com.example.guangbo;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.location.LocationManager;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.net.NetworkRequest;
    import android.support.v4.content.LocalBroadcastManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;

    import java.nio.channels.NetworkChannel;

    public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
    //本地广播
    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //本地广播
    localBroadcastManager= LocalBroadcastManager.getInstance(this);

    intentFilter=new IntentFilter();
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    networkChangeReceiver=new NetworkChangeReceiver();
    registerReceiver(networkChangeReceiver,intentFilter);
    Button button=(Button)findViewById(R.id.b1);
    button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    //本地广播
    Intent intent=new Intent("com.example.broadcasttext.LOCAL_BROADCAST");
    localBroadcastManager.sendBroadcast(intent);

    }
    });
    //动态注册本地广播
    intentFilter=new IntentFilter();
    intentFilter.addAction("com.example.broadcasttext.LOCAL_BROADCAST");
    localReceiver=new LocalReceiver();
    localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    //本地广播
    localBroadcastManager.unregisterReceiver(localReceiver);
    }
    class NetworkChangeReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
    ConnectivityManager connectivityManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
    if(networkInfo!=null&&networkInfo.isAvailable()){
    Toast.makeText(context,"网络可用",Toast.LENGTH_SHORT).show();
    }else{
    Toast.makeText(context,"网络不可用",Toast.LENGTH_SHORT).show();
    }


    }
    }
    class LocalReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {

    Toast.makeText(context,"接收本地广播",Toast.LENGTH_SHORT).show();



    }
    }
    }
     

    啊本地广播主要是通过LocalBriadcaseManager来进行管理

  • 相关阅读:
    水晶报表 注册码
    黑马孕育期盘口的技术辨识(转贴)
    如何判断庄家出货(转贴)
    解决方案:用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。
    水晶报表学习资料
    (网上收集)asp.net页面打印问题?
    arcgis地理配准第二种方法:利用已知控制点 (Spatial Adjustment和Georeferencing的区别)
    Vue父子组件之间通信
    Vue怎么引用组件和使用组件?
    ESLint:error 'reject' is defined but never used nounusedvars
  • 原文地址:https://www.cnblogs.com/837634902why/p/10336320.html
Copyright © 2011-2022 走看看