【问题标题】:Sending data from `BraodcastReceiver` to `Activity`将数据从“BraodcastReceiver”发送到“Activity”
【发布时间】:2016-02-10 19:26:10
【问题描述】:

我有一个 MainActivity 和一个 MyBroadcastReceiver。 BroadcastReceiver 等待收到的短信并读取短信和 senderId,它应该将此数据实时发送到 MainActivity。我尝试在 Activity 本身中实现 ​​BroadcastReceiver,但它再次启动了 Activity。

    Public class MainActivity extends AppCompatActivity{
 public static String BROADCAST_ACTION = "SMSCOMING";
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final Bundle bundle = intent.getExtras();
            try {
                //Getting the data d
                    triggerFunc(d);
                    }
                }
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
    };

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     IntentFilter filter = new IntentFilter();
        filter.addAction(BROADCAST_ACTION);
        this.registerReceiver(this.broadcastReceiver, filter);
}

void triggerFunc(data d){
   //Do some stuff
}

    }

【问题讨论】:

    标签: android android-activity broadcastreceiver


    【解决方案1】:

    请注意,我们在 Android 中有两种广播接收器:

    • 独立的广播接收器(四个主要的 Android 构建块之一)。这种类型的接收器必须在 Android 清单文件中注册。无论应用的 UI 是否正在运行,只要收到匹配的 Intent,就会运行这些接收器。

    • 活动中的广播接收器。这种接收器不需要在 Manifest 文件中注册,您应该在运行时注册它们。这些接收器仅在其封闭活动处于活动状态且正在运行时运行。

    因此,如果您希望您的应用能够捕获所有 SMS 消息,而不管其 UI 状态如何,您将需要前一个选项。但是,如果您需要应用在显示其活动时捕获 SMS 消息,则需要后一种选项。

    【讨论】:

    • 你能举个例子还是提供一个相关的链接
    【解决方案2】:

    BroadcastReceiver收到短信通知时,它无法知道Activity是否正在运行。如果要启动Activity,需要创建一个合适的Intent并调用Context.startActivity()

    您应该创建一个扩展BroadcastReceiver 的类,而不是简单地创建一个匿名内部类的实例。此外,您应该使用AndroidManifest.xml 中的<receiver> 标签注册您的BroadcastReceiver

    【讨论】:

    • 我一直在 Activity 本身中实现BroadcastReceiver(如上所述)请告诉如何在 AndroidManifest 中添加此接收器,因为它显示错误。
    • @shikharbansal 我添加了指向我的答案的链接以获取详细信息。我建议您熟悉d.android.com 的官方 Android 文档。这为了解 Android API 中的任何内容提供了一个很好的起点。
    【解决方案3】:

    您添加的任何有问题的代码都表明您的Receiver 仅在您Activity 运行时调用。而不是单独创建广播(从活动中删除并在您的包中创建新类)并在AndroidManifest 文件中注册并从接收器调用您的活动。

    如下所示。

    在你的包中创建 BroadcastReceiver 类。

    public class BinarySMSReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                final Bundle bundle = intent.getExtras();
                try {
                    //Getting the data d
                        Intent intent = new Intent();
                        intent.setClassName(context, "activity.class");
                        intent.putExtras(bundle);
                        context.startActivity(intent);
    
    
                } catch (Exception e) {
                    Log.e(TAG, "Exception: " + e.getMessage());
                }
            }
        };
    

    在 AndroidManifest 中

    <receiver android:name="com.company.application.SMSBroadcastReceiver" >
            <intent-filter android:priority="500">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    

    【讨论】:

    • 你在我输入评论时在编辑中修复了它。
    • context.startActivity 不会启动同一个 Activity 的新实例。
    • 单独创建广播(从活动中删除)并在 AndroidManifest 文件中注册并从接收器调用您的活动。
    • 我单独创建了广播并在AndroidManifest文件中注册。我不想从接收者那里调用活动。活动已经在运行。接收方发送的数据应在活动屏幕上更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多