安卓自定义广播没有响应

人生处万类,知识最为贤。这篇文章主要讲述安卓自定义广播没有响应相关的知识,希望能为你提供帮助。
最近在学习安卓的广播,其中根据书上自定义广播的代码运行后却没有反应,百度后知道了解决方案,记录下来:
 
一、同一包内自定义广播
1.首先新建一个广播接收器类MyBroadcastReceiver.java
File-new-other-Brodecast Receiver,然后在弹出框输入广播接收器的类名

安卓自定义广播没有响应

文章图片
安卓自定义广播没有响应

文章图片

 
 
2.修改MyBroadcastReceiver.java代码
package com.example.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyBroadcastReceiver extends BroadcastReceiver {@Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"receiver in MyBroadercastReceiver",Toast.LENGTH_SHORT).show(); } }

 
 
3.修改AndroidManifest.xml代码
其中第5、6行、第19-21行是我自己加上去的,其他不用原本就有。
修改后可以看到,我们让MyBroadcastReceiver广播接收器接受一条com.example.broadercasttest.MY_BROADCAST的广播,因此我们需要发送一条这样的广播
1 < ?xml version="1.0" encoding="utf-8"?> 2 < manifest xmlns:android="http://schemas.android.com/apk/res/android" 3package="com.example.broadcasttest"> 4 5< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 6< uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 7 8< application 9android:allowBackup="true" 10android:icon="@mipmap/ic_launcher" 11android:label="@string/app_name" 12android:roundIcon="@mipmap/ic_launcher_round" 13android:supportsRtl="true" 14android:theme="@style/AppTheme"> 15< receiver 16android:name=".MyBroadcastReceiver" 17android:enabled="true" 18android:exported="true"> 19< intent-filter> 20< action android:name="com.example.broadercasttest.MY_BROADCAST"/> 21< category android:name="android.intent.category.DEFAULT"/> 22< /intent-filter> 23< /receiver> 24< activity android:name=".MainActivity"> 25< intent-filter> 26< action android:name="android.intent.action.MAIN" /> 27< category android:name="android.intent.category.LAUNCHER" /> 28< /intent-filter> 29< /activity> 30< /application> 31 32 < /manifest>

 
 
4.修改activity_main.xml,添加一个发送按钮
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> < Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="发送广播"/> < /LinearLayout>

 
 
5.修改MainActivity.java,给按钮设置点击事件
          首先构建一个Intent对象,把要发送的广播值传入intent,而setComponent的方法就是告诉系统你该发给谁,换句话说就是谁接受广播,然后Content的sendBroadcast()方法将广播发送出去,这样所有监听 com.example.broadercasttest.MY_BROADCAST 这条广播的广播接收器就会收到消息,调用onReceive()方法。
1 package com.example.broadcasttest; 2 3 import androidx.appcompat.app.AppCompatActivity; 4 5 import android.content.BroadcastReceiver; 6 import android.content.ComponentName; 7 import android.content.Context; 8 import android.content.Intent; 9 import android.os.Bundle; 10 import android.view.View; 11 import android.widget.Button; 12 import android.widget.Toast; 13 14 public class MainActivity extends AppCompatActivity { 15@Override 16protected void onCreate(Bundle savedInstanceState) { 17super.onCreate(savedInstanceState); 18setContentView(R.layout.activity_main); 19Button button=(Button)findViewById(R.id.button); 20button.setOnClickListener(new View.OnClickListener() { 21@Override 22public void onClick(View v) { 23Intent intent=new Intent("com.example.broadercasttest.MY_BROADCAST"); 24intent.setComponent(new ComponentName(getPackageName(),"com.example.broadcasttest.MyBroadcastReceiver")); 25sendBroadcast(intent); 26} 27}); 28 }

 
如果没有加 intent.setComponent(new ComponentName(getPackageName(),"com.example.broadcasttest.MyBroadcastReceiver")); 这一句,程序运行后是没有响应的。
第一个参数是目标广播接收器所在应用的包名,第二个参数是目标广播接收器类全路径(即MyBroadcastReceiver类的路径)。
 
安卓自定义广播没有响应

文章图片

 
 
二、不同包内接收广播
即BrodecastTest程序发出的广播是可以被其他的应用程序接收到的
1.新建一个项目BrodecastTest2,然后新建一个广播接收器AnotherBrodecastReceiver.java
修改AnotherBrodecastReceiver.java
1 package com.example.brodecasttest2; 2 3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.widget.Toast; 7 8 public class AnotherBrodecastReceiver extends BroadcastReceiver { 9@Override 10public void onReceive(Context context, Intent intent) { 11Toast.makeText(context,"receive in AnotherBrodecastReceiver",Toast.LENGTH_SHORT).show(); 12 13} 14 }

 
 
2.修改AndroidManifest.xml
在receiver加入< action android:name="com.example.broadcasttest.MY_BROADCAST"/> ,说明AnotherBrodecastReceiver接收器也是接收com.example.broadcasttest.MY_BROADCAST这条广播
< receiver android:name=".AnotherBrodecastReceiver" android:enabled="true" android:exported="true"> < intent-filter> < action android:name="com.example.broadcasttest.MY_BROADCAST"/> < /intent-filter> < /receiver>

 
 
3.回到BrodecastTest项目,修改MainActivity.java
将intent.setComponent(new ComponentName(getPackageName(),"com.example.broadcasttest.MyBroadcastReceiver"))修改为 intent.addFlags(0x01000000); 会有红色下划线,但是不用理会。
 

4.依次运行两个程序,再回到手机里BrodecastTest软件的界面,点击发送广播按钮,会弹出两次提示信息
安卓自定义广播没有响应

文章图片
安卓自定义广播没有响应

文章图片

【安卓自定义广播没有响应】 

    推荐阅读