版权声明:独学而无友,则孤陋寡闻。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>