【8】Broadcast 自定义 静态&动态广播注册

版权声明:独学而无友,则孤陋寡闻。q群582951247 https://blog.csdn.net/mp624183768/article/details/82771675

静态注册广播

如图所示,新建一个Broadcast Receiver的Java文件,我命名为MyReceiver1.java

 

源码如下

package com.boradcasst.liuan.myboradcast;

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 = "MyReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        if (intent.getAction().equals("staticFilter")) {
            Log.e(TAG, "onReceive: goodName"+intent.getStringExtra("s_name"));
            Log.e(TAG, "onReceive: goodId "+intent.getIntExtra("s_id",0));
        }

    }
}

接着在Manifest对其进行注册,如下。对其中的intent-filter进行命名,待会要用到。

 

打开主页MainActivity.java,使用随机数发送静态广播,其中的random_goods()函数是我用来根据编号筛选所要发送的商品数据信息的,代码就不放了。

 

package com.boradcasst.liuan.myboradcast;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.boradcasst.liuan.myboradcast.R;

import java.util.Random;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    /**
     * click  me
     */
    private Button mBtClick;

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

    private void initView() {
        mBtClick = (Button) findViewById(R.id.bt_click);
        mBtClick.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.bt_click:
                //静态广播
                Intent intent=new Intent();
                intent.setAction("staticFilter");
                //产生随机数
                Random random=new Random();
                int i = random.nextInt(10);
                random_goods(i,intent);
                sendBroadcast(intent);
                break;
        }
    }

    private void random_goods(int i, Intent intent) {
        intent.putExtra("s_name","商品"+i);
        intent.putExtra("s_id",i);

    }
}

每次点击 打印如下

09-19 06:27:51.187 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品4
    onReceive: goodId 4
09-19 06:27:51.240 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品3
    onReceive: goodId 3
09-19 06:27:58.760 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品7
    onReceive: goodId 7
09-19 06:27:58.763 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品9
    onReceive: goodId 9
09-19 06:27:58.764 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品6
    onReceive: goodId 6
09-19 06:27:58.765 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品9
    onReceive: goodId 9
09-19 06:27:59.929 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品6
    onReceive: goodId 6
09-19 06:28:00.596 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品1
    onReceive: goodId 1
09-19 06:28:00.779 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品2
    onReceive: goodId 2
09-19 06:28:00.979 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品9
    onReceive: goodId 9
09-19 06:28:01.146 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品5
    onReceive: goodId 5
09-19 06:28:01.329 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品0
    onReceive: goodId 0
09-19 06:28:01.528 2817-2817/com.boradcasst.liuan.myboradcast E/MyReceiver: onReceive: goodName商品3
    onReceive: goodId 3

注意 android 7.0 对广播进行了 限制 8.0限制更为严格所以可能使用不了 这个地方需要注意一下

广播限制:除了有限的例外情况,应用无法使用清单注册隐式广播。 它们仍然可以在运行时注册这些广播,并且可以使用清单注册专门针对它们的显式广播。

解决方案也很简单 

                //静态广播
                Intent intent = new Intent();
                intent.setAction("staticFilter");
                //产生随机数
                Random random = new Random();
                int i = random.nextInt(10);
                random_goods(i, intent);
//兼容安卓8.0  参数为(应用包名,广播路径) 加上这句就好啦
                intent.setComponent(new ComponentName(getApplication().getPackageName(),
                        "com.boradcasst.liuan.myboradcast.MyReceiver"));
                sendBroadcast(intent);

动态注册广播

动态的8.0支持 

这就很nice

广播 还是那个广播

package com.boradcasst.liuan.myboradcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver2 extends BroadcastReceiver {
    private static final String TAG = "MyReceiver2";
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        if (intent.getAction().equals("dynamicFilter")) {
            Log.e(TAG, "onReceive: goodName"+intent.getStringExtra("s_name"));
            Log.e(TAG, "onReceive: goodId "+intent.getIntExtra("s_id",0));
        }

    }
}

发送广播的代码 还是那串代码

 //动态广播
                Intent intent2 = new Intent();
                intent2.setAction("dynamicFilter");
                //产生随机数
                Random random2 = new Random();
                int i2 = random2.nextInt(10);
                random_goods(i2, intent2);
                sendBroadcast(intent2);

然而 年年岁岁花相似,岁岁年年人不同

动态广播不用在清单文件里面注册

在代码onCreat 里面注册可以

        myReceiver2 = new MyReceiver2();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("dynamicFilter");
        registerReceiver(myReceiver2,intentFilter);

写代码要讲究严格  在相对的方法 onDestory 里面解除注册

   @Override
    protected void onDestroy() {
        super.onDestroy();
        if (myReceiver2 != null) {
            unregisterReceiver(myReceiver2);

        }
    }

最终源码 如下

package com.boradcasst.liuan.myboradcast;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import java.util.Random;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    /**
     * click  me
     */
    private Button mBtClick;
    /**
     * 动态广播
     */
    private Button mBtActiveBoradcast;
    private MyReceiver2 myReceiver2;

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

    private void initData() {
        myReceiver2 = new MyReceiver2();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("dynamicFilter");
        registerReceiver(myReceiver2,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (myReceiver2 != null) {
            unregisterReceiver(myReceiver2);

        }
    }

    private void initView() {
        mBtClick = (Button) findViewById(R.id.bt_click);
        mBtClick.setOnClickListener(this);
        mBtActiveBoradcast = (Button) findViewById(R.id.bt_active_boradcast);
        mBtActiveBoradcast.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.bt_click:
                //静态广播
                Intent intent = new Intent();
                intent.setAction("staticFilter");
                //产生随机数
                Random random = new Random();
                int i = random.nextInt(10);
                random_goods(i, intent);
                sendBroadcast(intent);
                break;
            case R.id.bt_active_boradcast:
                //动态广播
                Intent intent2 = new Intent();
                intent2.setAction("dynamicFilter");
                //产生随机数
                Random random2 = new Random();
                int i2 = random2.nextInt(10);
                random_goods(i2, intent2);
                sendBroadcast(intent2);
                break;
        }
    }

    private void random_goods(int i, Intent intent) {
        intent.putExtra("s_name", "商品" + i);
        intent.putExtra("s_id", i);

    }
}

file:/G:/AndroidStudioProjects/myBoradCast/app/src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/bt_click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="click Me" />
    <Button
        android:id="@+id/bt_active_boradcast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="动态广播" />
</LinearLayout>

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/82771675