Android BroadcastReceiver广播(一):基本使用

一、什么是广播

BroadcastReceiver是android 系统的四大组件之一,本质上就是一个全局的监听器,用于监听系统全局的广播消息,可以方便的实现系统中不同组件之间的通信。

程序可以通过调用context的sendBroadcast()方法来启动指定的BroadcastReceiver.

二、广播的生命周期

BroadcastReceiver生命周期只有十秒左右,如果在onReceive()内做超过十秒的事情,就会报错。所以广播中不要执行耗时操作,可以考虑启动一个Service来完成操作。

三、注册BroadcastReceiver

广播分为两种:静态注册和动态注册

1.静态注册

AndroidManifest.xml文件中配置

特点:常驻形广播,程序推出后,广播依然存在。

在AndroidManifest中进行注册后,不管该应用程序是否处于活动状态,都会进行监听,比如某个程序是监听 内存 的使用情况的,当在手机上安装好后,
不管该应用程序是处于什么状态,都会执行改监听方法中的内容。

goal:创建广播,新建一个类,继承自BroadcastReceiver,并重写onReceive()方法,在manifest文件中注册该广播,再发送广播

2.动态注册

代码中动态指定广播地址并注册

在代码中进行注册后,当应用程序关闭后,就不再进行监听。如果是在Activity中进行的注册和解注册,则生命周期是跟随该Activity的。

特点:非常驻型,广播会跟随程序的生命周期的结束而结束

goal:新建内部类,继承BroadcastReceiver,并重写onReceive()方法,在onStart()中注册广播,在onStop()中解除注册广播,在发送广播

 

A、Send  

1.1 activity_main.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:gravity="center"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="btn1"
        android:textSize="32sp" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="btn2"
        android:textSize="32sp" />

</LinearLayout>

1.2 MainActivity.java

package com.gatsby.intentfiltersend;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btn1, btn2;
    CrushReceiver crushReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    public void initView() {

        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);

        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btn1:
                CrushRegister();
                //发送动态广播
                Intent intent1 = new Intent();
                intent1.setAction("com.android.crushGril");
                intent1.putExtra("key", "CrsuhGril");
                sendBroadcast(intent1);
                break;
            case R.id.btn2:
                //发送静态广播
                Intent intent2 = new Intent();
                intent2.setAction("com.android.gatsby");
                sendBroadcast(intent2);
                break;
        }
    }

    //动态注册广播
    public void CrushRegister() {
        //实例化IntentFilter对象
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.android.crushGril");
        crushReceiver = new CrushReceiver();
        //注册广播接收
        registerReceiver(crushReceiver, filter);
    }

    class CrushReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            //通过继承 BroadcastReceiver建立动态广播接收器
            String action = intent.getAction();
            if (action.equals("com.android.crushGril")) {
                //通过吐司验证接收到广播
                Toast toast = Toast.makeText(context, "动态广播:" + action + " value-->" + intent.getStringExtra("key"), Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.TOP, 0, 0);//将吐司设置在屏幕顶端
                toast.show();
            }
        }
    }

    /*动态注册需在Acticity生命周期onPause通过
     *unregisterReceiver()方法移除广播接收器,
     * 优化内存空间,避免内存溢出
     */
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(crushReceiver);
    }

    //在销毁时要与广播解绑
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(crushReceiver);
    }

}

1.3.XHService 动态注册广播

	  public void SerialPortWrite(String strcmd)
		{
		   try
		   {		       
           byte[] bytes = strcmd.getBytes();
           mOutputBuffer.clear();
           mOutputBuffer.put(bytes);
           mSerialPort.write(mOutputBuffer, bytes.length);
           Thread.sleep(200);
		   }
		   catch (Exception e)
			 {
		 	   e.printStackTrace();
		   }
		}
		
		XHService(Context context)
		{
			   	Log.d(TAG, "enter XHService");
			   	
			   	mContext=context;
			   	
			   	XHService_SerialInit();
			   	 
			   	IntentFilter filter = new IntentFilter(); 
			   	     
				  filter.addAction(Intent.ACTION_TIME_CHANGED);
				  filter.addAction(Intent.ACTION_SCREEN_ON);
				  filter.addAction(Intent.ACTION_SCREEN_OFF);
				  filter.addAction(Intent.ACTION_BOOT_COMPLETED);
			  	filter.addAction("com.xinhua.scheduled");
			  	filter.addAction("com.xinhua.ethernet_static");
			  	filter.addAction("com.xinhua.ethernet_enable");
			  	filter.addAction("com.xinhua.ethernet_dhcp");	
			  	filter.addAction("xy.update.third.apk.start");  
			  	filter.addAction("com.xinhua.scheduledSysOrApi");	
				  context.registerReceiver(mIntentReceiver, filter);
				  

					mEthManager = (EthernetManager) mContext.getSystemService(Context.ETHERNET_SERVICE);
					mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
					
					if(SystemProperties.get("persist.rild.libpath","/system/lib/libreference-ril-ls-u8300.so")
						.equals("/system/lib/libreference-ril-huawei-me909s.so")){
								Thread thread = new Thread(NetChceck);
			    			thread.start();
					}	
					mHandler = new xhHandler(FgThread.get().getLooper());	
		}
		

 mIntentReceiver 广播接收

		BroadcastReceiver mIntentReceiver = new BroadcastReceiver()
		{
	        public void onReceive(Context context, Intent intent) 
	        {
	        			Log.d(TAG, "receiver intent :"+intent.getAction());
	        			
	        			if (intent.getAction().equals(Intent.ACTION_TIME_CHANGED))
					      {
					      	  SetMcuTime(); 
					      }

 

B、Receiver  静态注册广播、传递信息到活动页面Activity

2.1 activity_main.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:gravity="center"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="btn1"
        android:textSize="32sp" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="绘梨衣"
        android:textSize="64sp" />
    
</LinearLayout>

2.2 AndroidManifest.xml

        <receiver android:name=".MyCrushBroadcastReceiver">
            <intent-filter>
                <action android:name="com.android.crushGril" />
                <action android:name="com.android.gatsby"/>
            </intent-filter>
        </receiver>

2.3 MainActivity.java

package com.gatsby.broadcastreceiver;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btn1;
    TextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    public void initView() {
        tv1 = (TextView) findViewById(R.id.tv1);

        btn1 = (Button) findViewById(R.id.btn1);
        btn1.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn1:
                MyCrushBroadcastReceiver myCrushBroadcastReceiver = new MyCrushBroadcastReceiver();
                Log.d("gatsby","receive value!"+myCrushBroadcastReceiver.getGatsbySting());
                tv1.setText(myCrushBroadcastReceiver.getGatsbySting());
                break;
        }
    }
}

2.3 MyCrushBroadcastReceiver.java

package com.gatsby.broadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyCrushBroadcastReceiver extends BroadcastReceiver {

    static String gatsbyString;

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("com.android.crushGril")) {
            Toast toast = Toast.makeText(context, "静态广播CrushGril:" + action + " value->" + intent.getStringExtra("key"), Toast.LENGTH_SHORT);
            toast.show();
        } else if (action.equals("com.android.gatsby")) {
            gatsbyString = "Gatsby receive CrushGril";
            Toast toast = Toast.makeText(context, "静态广Gatsby:->" + action + " value->", Toast.LENGTH_SHORT);
            toast.show();
        }
    }

    //处理返回信息
    public static String getGatsbySting() {
        return gatsbyString;
    }
}

 

posted @ 2020-05-23 11:01  CrushGirl  阅读(1265)  评论(0编辑  收藏  举报