博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android】BroadcastReceiver简介和用法实例,两种注册方式 (二)
阅读量:2298 次
发布时间:2019-05-09

本文共 6279 字,大约阅读时间需要 20 分钟。

  • 博客分类: 
 

 

一.BroadcastReceiver简介 

   BraodcastReceiver(广播接收器)是为了实现系统广播而提供的一种组件,它和事件处理机制类似,但是事件处理机制是程序组件级别的,而广播事件处理机制是系统级别的。比如,我们可以发出一种广播来测试手机电量的变化,这时候就可以定义一个BraodcastReceiver来接受广播,当手机电量较低时提示用户。我们既可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。我们同样可以在自己的应用程序中实现BroadcastReceiver来监听和响应广播的Intent。

   在程序中使用BraodcastReceiver是比较简单的。首先要定义一个类继承BraodcastReceiver,并且覆盖onReceiver()方法来响应事件。然后注册在程序中BraodcastReceiver。最后构建Intent对象调用sendBroadcast()方法将广播发出。

二.BroadcastReceiver的注册方式

 1.静态注册方式

   静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。静态注册方式的特点:不管改应用程序是否处于活动状态,都会进行监听,比如某个程序时监听内存 的使用情况的,当在手机上安装好后,不管改应用程序是处于什么状态,都会执行改监听方法中的内容。

下面是具体的例子:

MainActivity.java

package com.android.broadcast;   
 
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
 
public class MainActivity extends Activity{  
    //定义action常量  
    protected static final String ACTION = "com.android.broadcast.RECEIVER_ACTION";  
    //定义Button对象  
    private Button btnBroadcast;  
    @Override 
    public void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        btnBroadcast=(Button)findViewById(R.id.btnBroadcast);  
        //为按钮设置单击监听器  
        btnBroadcast.setOnClickListener(new OnClickListener(){  
            @Override 
            public void onClick(View v){  
                //实例化Intent  
                Intent intent=new Intent();  
                //设置Intent的action属性  
                intent.setAction(ACTION);  
                //发出广播  
                sendBroadcast(intent);  
            }  
        });  
    }  

在“com.android.broadcast”包中定义一个MyReceiver类,继承于BroadcastReceiver,覆盖onReceive()方法。

MyReceiver.java

package com.android.broadcast;   
 
import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;  
import android.util.Log;  
 
public class MyReceiver extends BroadcastReceiver{  
   //定义日志标签  
    private static final String TAG = "Test";  
    @Override 
    public void onReceive(Context context, Intent intent){  
        //输出日志信息  
        Log.i(TAG, "MyReceiver onReceive--->");  
    }  
}  

main.xml

 
 
    
 
 

在AndroidManifest.xml配置文件中16~20行声明receiver

 
 
    
 
 
    
 
        
 
            
 
                
 
                
 
            
 
         
        
 
            
 
                
 
            
 
         
     
 

效果图:

 

 当我们点击按钮的时候,程序会调用onReceive()方法,LogCat输出信息如下:

 2.动态注册方式

   动态注册方式在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。

下面是具体的例子:

 MainActivity.java

package com.android.broadcast;   
 
import android.app.Activity;  
import android.content.Intent;  
import android.content.IntentFilter;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
 
public class MainActivity extends Activity{  
    //定义Action常量  
    protected static final String ACTION = "com.android.broadcast.RECEIVER_ACTION";  
    private Button btnBroadcast;  
    private Button registerReceiver;  
    private Button unregisterReceiver;  
    private MyReceiver receiver;  
    @Override 
    public void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        btnBroadcast=(Button)findViewById(R.id.btnBroadcast);  
        //创建事件监听器  
        btnBroadcast.setOnClickListener(new OnClickListener(){  
            @Override 
            public void onClick(View v){  
                Intent intent=new Intent();  
                intent.setAction(ACTION);  
                sendBroadcast(intent);  
            }  
        });  
          
        registerReceiver=(Button)findViewById(R.id.btnregisterReceiver);  
        //创建事件监听器  
        registerReceiver.setOnClickListener(new OnClickListener(){  
            @Override 
            public void onClick(View v){  
                receiver=new MyReceiver();  
                IntentFilter filter=new IntentFilter();  
                filter.addAction(ACTION);  
                //动态注册BroadcastReceiver  
                registerReceiver(receiver, filter);  
            }  
        });  
          
        unregisterReceiver=(Button)findViewById(R.id.btnunregisterReceiver);  
        //创建事件监听器  
        unregisterReceiver.setOnClickListener(new OnClickListener(){  
            @Override 
            public void onClick(View v){  
                //注销BroadcastReceiver  
                unregisterReceiver(receiver);  
            }  
        });  
    }  

 在“com.android.broadcast”包中定义一个MyReceiver类,继承于BroadcastReceiver,覆盖onReceive()方法。

MyReceiver.java

package com.android.broadcast;   
 
import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;  
import android.util.Log;  
 
public class MyReceiver extends BroadcastReceiver{  
    //定义日志标签  
    private static final String TAG = "Test";  
    @Override 
    public void onReceive(Context context, Intent intent){  
        //输出日志信息  
        Log.i(TAG, "MyReceiver onReceive--->");  
    }  
}  

main.xml

 
 
    
 
    
 
    
 
 

效果图:

 

①当我们首先点击按钮的时候,因为程序没有注册BraodcastReceiver,所以LogCat没有输出任何信息。

②当我们先点击再点击按钮的时候,这时程序会动态的注册BraodcastReceiver,之后会调用onReceive()方法,LogCat输出信息如下:

 

 ③当我们点击按钮的时候,这时程序会注销BraodcastReceiver,再点击,LogCat没有输出任何信息。

三.BroadcastReceiver 的生命周期

   一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。

 

本文出自 “” 博客,请务必保留此出处

分享到:   
 | 

    转载地址:http://nfkib.baihongyu.com/

    你可能感兴趣的文章
    [天池竞赛系列] 历届天池竞赛答辩PPT和视频
    查看>>
    深入FFM原理与实践
    查看>>
    用python实现一个神经网络
    查看>>
    tensorflow实现AlexNet
    查看>>
    CNN笔记:通俗理解卷积神经网络
    查看>>
    在tensorflow中使用CNN
    查看>>
    scala集合操作
    查看>>
    基于tensorflow实现word2vec
    查看>>
    1x1卷积核如何降低参数量
    查看>>
    DenseNet 简介
    查看>>
    python快速入门
    查看>>
    学习经历与求职经历分享
    查看>>
    python中ndarray与dataframe互转
    查看>>
    在Python中使用多进程快速处理数据
    查看>>
    基于sklearn同时处理连续特征和离散特征
    查看>>
    安卓app开发项目管理必备工具(干货!)
    查看>>
    ButterKnife(8.4.0版本)原理分析
    查看>>
    深入理解Java内存模型
    查看>>
    Java对象到底多大?
    查看>>
    Swift3.0学习笔记-The Basics(对比Java)
    查看>>