繁体   English   中英

如何将数据从 BroadcastReceiver 传递到 Android 中的活动

[英]How to Pass Data From a BroadcastReceiver to an Activity in Android

我正在开发我的第一个 Android 应用程序,它是一个寻呼设备。 它将截获来自某个号码的带有特定内容的 SMS 消息,显示该消息,然后允许用户将预定义的回复发送回同一号码。 我已经从许多来源(当然包括 stackoverflow)收集了代码片段,但我还没有让它工作。

我的文件结构如下所示

在此处输入图像描述

我正在努力解决的部分是 SmsBroadcastReceiver 和 ReceiveAlert,它们应该显示 SMS 的内容并有一个按钮来启动回复。

SmsBroadcastReceiver.java 看起来像这样:

package com.example.alert6;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Telephony;
import android.telephony.SmsMessage;

public class SmsBroadcastReceiver extends BroadcastReceiver {
    public static final String EXTRA_MESSAGE = "com.example.alert6.MESSAGE";

    @Override
    public void onReceive(Context context, Intent intent) {
            String smsSender = "";
            String smsBody = "";
            for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) {
                smsSender = smsMessage.getOriginatingAddress();
                smsBody = smsMessage.getMessageBody();
            }

            if (smsSender.equals("+420775367297")) {
                if (smsBody.contains("Test")) {
                    intent.putExtra(EXTRA_MESSAGE, smsBody);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // adding this flag starts the new Activity in a new Task
                    context.startActivity();
                }
            }
    }

}

ReceiveAlertActivity.java 是这样的:

package com.example.alert6;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;

import android.view.View;
import android.widget.TextView;

public class ReceiveAlertActivity extends AppCompatActivity {

    private static final int SMS_PERMISSION_CODE = 101;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receive_alert);
    }

    // Get the Intent that started this activity and extract the string
    Intent intent = getIntent();
    String taskingalert = intent.getStringExtra(SmsBroadcastReceiver.EXTRA_MESSAGE);

    // Capture the layout's TextView and set the string as its text
    TextView receivedAlert = findViewById(R.id.receivedAlert);
        receivedAlert.setText(taskingalert);

public boolean respond(View view) {
        if (!hasReadSmsPermission()) {
            requestReadAndSendSmsPermission();
            return false;
        }
        Intent intent = new Intent(this, SendResponseActivity.class);
        startActivity(intent);
        return false;
    }

    /**
     * Runtime permission shenanigans
     */
    private boolean hasReadSmsPermission() {
        return (ContextCompat.checkSelfPermission(ReceiveAlertActivity.this,
                Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED) &&
                (ContextCompat.checkSelfPermission(ReceiveAlertActivity.this,
                        Manifest.permission.RECEIVE_SMS) == PackageManager.PERMISSION_GRANTED) &&
                (ContextCompat.checkSelfPermission(ReceiveAlertActivity.this,
                        Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED);
    }

    private void requestReadAndSendSmsPermission() {
        ActivityCompat.requestPermissions(ReceiveAlertActivity.this, new String[]{Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS, Manifest.permission.SEND_SMS},
                SMS_PERMISSION_CODE);
    }
}

清单是这样的:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.alert6">

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Alert6">

        <activity
            android:name=".SendResponseActivity"
            android:parentActivityName=".ReceiveAlertActivity">
        </activity>

        <activity
            android:name=".ReceiveAlertActivity"
            android:parentActivityName=".MainActivity">
        </activity>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".SmsBroadcastReceiver"
            android:enabled="true"
            android:exported="true"
            tools:ignore="Instantiatable">
            <intent-filter android:priority="999" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

Android Studio 在 SmsBroadcastReceiver 和 ReceiveAlertActivity 中显示错误,但没有提供足够的信息来解决它们。

在 SmsBroadcastReceiver 中,它告诉我它无法解析方法“startActivity()”。 有些东西需要 go 在括号中,但是什么?

在ReceiveAlertActivity 中,问题围绕receivedalert 和taskingalert。 它无法解析 setText,因为 taskingalert 是未知的 class。 显然它不是 class,它是一个字符串,所以我做错了什么,但是什么?

解决这些问题可能还没有结束。 目前我无法测试应用程序是否工作,因为由于上述原因构建失败。 然后,如果我让这一切正常工作,我还有其他一些挑战,比如唤醒屏幕并播放触发广播接收器的声音,以及在按下按钮时停止声音。

您可以在 BroadcastReceiver 中使用Observable BroadcastReceiver来存储您要发送的信息,并在您的Activity中实现Observer接口,以便在Observable ZA8CFDE6331BD59EB2AC96FB9666 发生的每一次更改时都会收到警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM