zoukankan      html  css  js  c++  java
  • Android-广播总结

    1.发送广播:

        其实发送广播属于隐式意图

            1.1.系统发出的广播(有序广播/无序广播)

           1.2自己发出的广播(有序广播/无序广播)

    2.订阅广播:

            2.1.AndroidManifest.xml形式订阅接收者

            2.2.Java代码订阅广播(onCreate方法中订阅接收者(能够发现广播接收者是唯一可以new的组件),onDestroy方法里解除订阅,如果不解除订阅会引发泄露异常)

    3.广播的生命周期方法:就一个方法

               onReceive(Context context, Intent intent)

                 广播接收者组件,什么时候被激活,当执行 onReceive(Context context, Intent intent) 的时候被激活

               广播接收者组件,什么时候被回收,当执行完 onReceive(Context context, Intent intent) 后,系统会自动回收 

    4.广播接收者,耗时操作

     onReceive(Context context, Intent intent) 方法不能执行耗时操作

      因为广播接收者是和Activity一样在主线程运行(Activity是五秒未响应就ANR异常,而广播接收者十秒未响应就ARN异常)

    如果一定要在广播接收者里执行耗时操作,怎么办?

    答:不能开启子线程,因为在执行完生命周期方法(onReceive(Context context, Intent intent) )后,系统会自动回收广播接收者,所以不能开子线程

      可以去开启一个服务-->服务再去开启主线程执行耗时操作 content.startService();   

    5.广播接收者,去跳转Activity

    AndroidManifest.xml 订阅 接收者

        <!--
                订阅(Xml形式订阅接收者)
                订阅接收者:专门去跳转Activity
            -->
            <receiver android:name=".br.StartActivityBroadcastReceiver">
    
                <intent-filter>
    
                    <action android:name="my_customo.start_action_action" />
    
                    <data android:scheme="startActivityScheme" />
    
                </intent-filter>
    
            </receiver>

    接收者:

    package liudeli.croadcast1.br;
    
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    import liudeli.croadcast1.MainActivity;
    
    /**
     * 此接收者,专门用来跳转Activity
     */
    public class StartActivityBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            startActivity(context);
        }
    
        /**
         * 启动另外一个Activity
         */
        private void startActivity(Context context) {
            Intent intent = new Intent(context, MainActivity.class);
            /**
             * 注意:⚠️  在非Activity的地方 去启动Activity,必须加入以下标记
             *          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             */
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }

    发送广播:

     

      /**
         * 发送广播给 ---> 接收者
         */
        public void startActivity(View view) {
            /**
             * 订阅的信息:
             *            <intent-filter>
             *
             *                 <action android:name="my_customo.start_action_action" />
             *
             *                 <data android:scheme="startActivityScheme" />
             *
             *             </intent-filter>
             */
            /**
             * 发送广播原则,接收者怎么去订阅的,我就怎么去发送广播
             */
            Intent intent = new Intent();
            intent.setAction("my_customo.start_action_action");
            intent.setData(Uri.parse("startActivityScheme:我要激活另外一个Activity"));
            sendBroadcast(intent);
        }

     

    效果:

             

  • 相关阅读:
    CentOS 6.3下Samba服务器的安装与配置(转)
    利用香蕉派自制电视盒子
    利用arduino制作瓦力万年历-1.0
    arduino:int & double 转string 适合12864下使用
    centos 6.X下建立arduino开发环境
    树莓派学习笔记(7):利用bypy实现树莓派NAS同步百度云
    直接插入排序
    直接选择排序
    快速排序算法
    git 分支管理 推送本地分支到远程分支等
  • 原文地址:https://www.cnblogs.com/android-deli/p/10140715.html
Copyright © 2011-2022 走看看