zoukankan      html  css  js  c++  java
  • android之广播的实现

    实验内容

    1.创建一个应用程序,点击按钮实现发送广播。收到广播后在logcat中显示“智能终端开发课程在学银在线开课啦”。运行效果如图所示

    2.创建三个广播接收者1、2、3,并在注册时设置广播接收者的优先级,实现有序广播,要求按照3、2、1的顺序接受广播消息,在logcat中按接受顺序显示广播接收者的名称。(自行编写发送有序广播信息的界面,可以与第一问的界面风格相同)

     BroadcastReceiver广播接收者是Android四大组件之一。一般的都要在AndroidManifest中静态注册,但是只有广播接收者可以使用java代码的方法来动态注册
           BroadcastReceiver是用于接收广播的组件用于组件与组件之间进行通信,可以跨应用程序传递.如操作系统电池电量低会发送一个广播,这样我们的程序里面可以去监听这个广播,可以关 闭程序里面比较耗电的功能,提示用户注意保存进度什么的,还如其它安装新应用等,还有普通应 用程序,例如启动特定线程,文件下载完毕等。
           Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。
           广播的发送的一般应用场合:发送频率低的情况可以使用,数据量小的情况可以使用。

    (一)BroadcastReceiver创建

           要创建自己的BroadcastReceiver对象,我们需要继承BroadcastReceiver类,并实现其onReceive 方法。 在onReceive方法内,我们可以获取随广播而来的Intent中的数据,这非常重要,就像无线电一样,包含很多有用的信息。 在创建完我们的BroadcastReceiver之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址。没有注册广播地址的BroadcastReceiver就像一个缺少选台按钮的收音机,虽然功能俱备,但也无法收到电台的信号。所以创建类后就要对BroadcastReceiver进行注册。

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class MyReceiver4 extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO: This method is called when the BroadcastReceiver is receiving
            // an Intent broadcast.
            throw new UnsupportedOperationException("Not yet implemented");
        }
    }

    (二)BroadcastReceiver注册

    1.静态注册

    静态注册是在AndroidManifest.xml文件中配置的

    <receiver android:name=".MyReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.MY_BROADCAST" /> 
                    <category android:name="android.intent.category.DEFAULT" /> 
                </intent-filter>
            </receiver>

    2.动态注册

           动态注册需要在代码中动态的指定广播地址并注册
           注意,registerReceiver是android.content.ContextWrapper类中的方法,Activity 和Service都继承了ContextWrapper,所以可以直接调用。 在实际应用中,我们在 Activity或Service中注册了一个BroadcastReceiver,当这个Activity或Service被销毁时 如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了。所以,记得在 特定的地方执行解除注册操作。

    MyBroadcastReceiver mbcr = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter();          filter.addAction(MyBroadcastReceiver.MY_BC_FIRST);
    registerReceiver(mbcr, filter);// 注册
    (2)解除注册代码,一般在页面销毁时操作
     @Override 
     protected void onDestroy() { 
            unregisterReceiver(mbcr); 
            mbcr = null; 
            super.onDestroy(); 
        }

    通过上面两步其实已经完成了一个简单功能的广播接收者,已经可以具有接受广播功能了。在onReceive方法里面就可以做自己想要的处理。
           但是上面的BroadcastReceiver注册时的action动作意图值是自己定义的字符串,需要自己发送对应意图的广播才能让上面的广播接收到消息,如果是上面使用系统定义好的动作意图action,那么,就可以接收到系统发过来的广播信息,比如手机接收到短信,手机底层是会发送一条广播,查看手机系统内是否有符合条件的广播接收者,如果有就会向它发送信息。。。
           静态注册的广播的程序运行一次后,以后能一直保持广播接收的状态,只要有对应的广播就能接收它的广播信息。而动态注册的广播需要程序在运行中才能接收广播。

    关于优先级的说明:

    <intent-filter android:priority="999">

    上面的内容是参考Android广播接收者使用总结dhttps://blog.csdn.net/pingping_010/article/details/d80662198

    然后就来写代码

    不用写动态的,只要静态的就可以完成。然还需要建立三个广播接收者

    建的过程:右键->new->other->Broadcast

    系统自动在AndroidManifest.xml中创建receiver,创建intent-filter实现action android:name

    发送,接收广播

    第一步:创建三个广播接收者和发送广播

    发送广播

    public class MainActivity extends AppCompatActivity {
    
        private Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.homework_10);
    
            button = (Button) findViewById(R.id.button40);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //发送广播使用sendBroadcast,需要指定Intent的action来说明发送什么样的广播。 
    //Intent里面的参数是action,要和静态注册的广播的actin对应
    //Toast.makeText(MainActivity.this,"广播已发送--2---!!!",Toast.LENGTH_SHORT).show(); Intent intent = new Intent("myBroadcastReceiver"); intent.putExtra("msg", "小葵花妈妈智能终端开发课程在学银在线开课啦!!!孩子学习老不好,打一顿就好了!!!"); intent.setPackage(getPackageName());//8.0以上系统必须加这条,否则无法接收到 sendOrderedBroadcast(intent,null);//如果是该自定义的广播接收者发送广播,第二个参数一般为null Toast.makeText(MainActivity.this,"广播已发送!!!",Toast.LENGTH_SHORT).show(); } }); } }
    public class MyReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("Receiver", "这是静态的广播接受者(优先级500)---》" + intent.getStringExtra("msg"));
            Toast.makeText(context, "这是使用静态的方法来创建的广播(优先级500)接受者收到消息", Toast.LENGTH_SHORT).show();
            LogUtils.e("这是使用静态的方法来创建的广播(优先级500)接受者收到消息");
            //abortBroadcast();
        }
    }
    public class MyReceiver2 extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("Receiver", "这是静态的广播接受者(优先级999)---》" + intent.getStringExtra("msg"));
            Toast.makeText(context, "这是使用静态的方法来创建的广播接受者(优先级999)收到消息", Toast.LENGTH_SHORT).show();
            LogUtils.e("这是使用静态的方法来创建的广播(优先级999)接受者收到消息");
            //abortBroadcast();
        }
    }
    public class MyReceiver3 extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("Receiver", "这是静态的广播接受者(优先级1111)---》" + intent.getStringExtra("msg"));
            Toast.makeText(context, "这是使用静态的方法来创建的广播接受者(优先级1111)收到消息", Toast.LENGTH_SHORT).show();
            LogUtils.e("这是使用静态的方法来创建的广播(优先级1111)接受者收到消息");
            //abortBroadcast();
        }
    }

    LogUtils是我自己以前写的一个日志类,这里用不用都不影响

    public class LogUtils {
    
        private final static boolean all = true;
        private final static boolean e = true;
        private final static String defaultTag = "Activet";
    
        public static void e(String msg) {
            if (all && e) {
                try {
                    android.util.Log.e(defaultTag, msg);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }
        /**
         * err Log print
         *
         * @param tag
         *            :print tag
         * @param msg
         *            :print message
         */
        public static void E(String tag, String msg) {
            if (all && e) {
                android.util.Log.e(tag, msg);
            }
        }
    }

    运行结果:

     

    关于广播接收者先暂时写这么多吧,后续再补上相关的其他知识点!

    加油,未来可期!!!

    补一下xml文件,忘了,嘿嘿

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/loading">
    
        <Button
            android:id="@+id/button40"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="发送广播信息" />
    </LinearLayout>
  • 相关阅读:
    ASP.NET Core中的Action的返回值类型
    ASP.NET Core中的Controller
    ASP.NET Core Authentication and Authorization
    ASP.NET Core
    ASP.NET Core ActionFilter引发的一个EF异常
    使用Github Packages功能上传nuget包到Github
    「每日五分钟,玩转JVM」:线程共享区
    JVM(二):画骨
    Spring Boot 2.x (十八):邮件服务一文打尽
    一道面试题
  • 原文地址:https://www.cnblogs.com/rebirther/p/12963853.html
Copyright © 2011-2022 走看看