zoukankan      html  css  js  c++  java
  • 解决安卓自定义广播没有响应问题以及不同程序间接收广播

    最近在学习安卓的广播,其中根据书上自定义广播的代码运行后却没有反应,百度后知道了解决方案,记录下来:

     

    一、同一包内自定义广播

    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"
     3     package="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
     9         android:allowBackup="true"
    10         android:icon="@mipmap/ic_launcher"
    11         android:label="@string/app_name"
    12         android:roundIcon="@mipmap/ic_launcher_round"
    13         android:supportsRtl="true"
    14         android:theme="@style/AppTheme">
    15         <receiver
    16             android:name=".MyBroadcastReceiver"
    17             android:enabled="true"
    18             android: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
    16     protected void onCreate(Bundle savedInstanceState) {
    17         super.onCreate(savedInstanceState);
    18         setContentView(R.layout.activity_main);
    19         Button button=(Button)findViewById(R.id.button);
    20         button.setOnClickListener(new View.OnClickListener() {
    21             @Override
    22             public void onClick(View v) {
    23                 Intent intent=new Intent("com.example.broadercasttest.MY_BROADCAST");
    24                 intent.setComponent(new ComponentName(getPackageName(),"com.example.broadcasttest.MyBroadcastReceiver"));
    25                 sendBroadcast(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
    10     public void onReceive(Context context, Intent intent) {
    11         Toast.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软件的界面,点击发送广播按钮,会弹出两次提示信息

  • 相关阅读:
    VirtualBox中的Linux读取Windows共享目录
    Windows10资源管理器去掉左侧“下载、文档、图片、音乐、视频”等目录
    在Eclipse ee中成功使用jQuery UI插件
    (medium)LeetCode .Implement Trie (Prefix Tree)
    (*medium)LeetCode 211.Add and Search Word
    (easy)LeetCode 257.Binary Tree Paths
    2016 360笔试 编程题 2
    2016 360笔试 编程题1
    (番外)使用DFS和BFS实现拓扑排序
    (medium)LeetCode 210.Course Schedule II
  • 原文地址:https://www.cnblogs.com/panqiaoyan/p/12882487.html
Copyright © 2011-2022 走看看