将数据从“BroadcastReceiver”发送到“Activity”
Sending data from `BraodcastReceiver` to `Activity`
我有一个 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
}
}
当BroadcastReceiver
收到短信通知时,无法知道Activity
是不是运行。如果你想启动 Activity,你需要创建一个合适的 Intent
并调用 Context.startActivity()
.
您应该创建一个扩展 BroadcastReceiver
的 class 而不是简单地创建一个匿名内部 class 的实例。此外,您应该使用 AndroidManifest.xml
中的 <receiver>
标签注册您的 BroadcastReceiver
。
根据您的 Receiver
仅在 Activity
为 运行 时才调用的问题添加的任何代码。而不是单独创建广播(从 activity 中删除并在您的包中创建新的 class)并在 AndroidManifest
文件中注册并从 Receiver 调用您的 activity。
如下图。
在您的包中创建 BroadcastReceiver Class。
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>
请注意我们在Android中有两种广播接收器:
独立广播接收器(四个主要 Android 构建块之一)。这种类型的接收器必须在 Android 清单文件中注册。无论应用的 UI 是 运行ning 与否,只要收到它们的匹配意图,这些接收者就会 运行。
In-Activity 广播接收器。此类接收器不需要在 Manifest 文件中注册,您应该在 运行 时注册它们。这些接收器仅在其封闭 activity 处于活动状态且 运行ning.
时才为 运行
因此,如果您希望您的应用能够捕获所有 SMS 消息,而不管其 UI 状态如何,您将需要前一个选项。但是,如果您需要您的应用程序在显示 activity 时捕获 SMS 消息,则需要后一个选项。
我有一个 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
}
}
当BroadcastReceiver
收到短信通知时,无法知道Activity
是不是运行。如果你想启动 Activity,你需要创建一个合适的 Intent
并调用 Context.startActivity()
.
您应该创建一个扩展 BroadcastReceiver
的 class 而不是简单地创建一个匿名内部 class 的实例。此外,您应该使用 AndroidManifest.xml
中的 <receiver>
标签注册您的 BroadcastReceiver
。
根据您的 Receiver
仅在 Activity
为 运行 时才调用的问题添加的任何代码。而不是单独创建广播(从 activity 中删除并在您的包中创建新的 class)并在 AndroidManifest
文件中注册并从 Receiver 调用您的 activity。
如下图。
在您的包中创建 BroadcastReceiver Class。
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>
请注意我们在Android中有两种广播接收器:
独立广播接收器(四个主要 Android 构建块之一)。这种类型的接收器必须在 Android 清单文件中注册。无论应用的 UI 是 运行ning 与否,只要收到它们的匹配意图,这些接收者就会 运行。
In-Activity 广播接收器。此类接收器不需要在 Manifest 文件中注册,您应该在 运行 时注册它们。这些接收器仅在其封闭 activity 处于活动状态且 运行ning.
时才为 运行
因此,如果您希望您的应用能够捕获所有 SMS 消息,而不管其 UI 状态如何,您将需要前一个选项。但是,如果您需要您的应用程序在显示 activity 时捕获 SMS 消息,则需要后一个选项。