当在学习安卓自定义广播为什么会接受不到广播呢?
在学习安卓的时候,会学习BroadcastReceiver,当自定义一个广播时,你会发现发送广播后没有接受成功后的指令。经过我的查找我才知道Android8.0后会限制使用AndroidManifest.xml来注册隐式广播。
经过学习和看大神的最终整合如下试图。
话不多说,直接上案例:
在发送广播之前,我们需要一个广播接收器来接受此广播,不然你发了也是白发。
先创建一个类如下:
然后在这个类继承自BroadcastReceiver,代码如下:
// An highlighted block
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
}
我做的是一个非常简单的案列,当接受到这个广播,会显示“ received in MyBroadcastReceiver”。
然后在AndroidManifest.xml内进行注册:
// An highlighted block
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
其中的Enabled属性的作用是是否启动这个广播接受器。
Exported属性的作用是是否允许这个广播接收器接受本程序以外的广播。
在xml中定义一个按钮,这个案列比较简单,我就不一一列举出来了。
在mainactivity.java中的代码如下:
// An highlighted block
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setComponent(new ComponentName(getPackageName(),"com.example.broadcastreceiver3.MyBroadcastReceiver"));
sendBroadcast(intent);
}
});
}
}
自定义广播接受器主要的是:
setComponent(new ComponentName(getPackageName(),“com.example.broadcastreceiver3.MyBroadcastReceiver”));
sendBroadcast(intent);
我自己感觉的是:当我们点击按钮会生成一个Intent实例,然后通过sendBroadcast(intent);发送广播信息,而setComponent的方法就是告诉系统你该发给谁,换句话说就是谁接受广播。第一个参数是目标广播接收器所在应用的包名,第二个参数是目标广播接收器类全路径。
这就是解决方案,(其中有大神的帮助)。