将数据从“BraodcastReceiver”发送到“Activity”

时间:2016-02-10 19:26:11

标签: android android-activity broadcastreceiver

我有一个MainActivity和一个MyBroadcastReceiver。 tsql: use [sql2016] GO GRANT VIEW DEFINITION TO [public] GO 等待传入的短信并读取短信和senderId,它应该实时将此数据发送到BroadcastReceiver。我试图在Activity本身中实现BroadcastReceiver,但它再次启动活动。

MainActivity

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

BroadcastReceiver收到短信通知时,它无法知道Activity是否正在运行。如果您要启动活动,则需要创建适当的Intent并致电Context.startActivity()

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

答案 2 :(得分:0)

根据您Receiver仅在Activity正在运行时调用的AndroidManifest,您提出的任何代码都会被添加。而不是单独创建广播(从活动中移除并在您的包中创建新类)并在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()); } } }; 文件中注册并从Receiver中调用您的活动。

就像下面一样。

在你的包中创建BroadcastReceiver类。

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

 // Client side code
 socket.emit('an event', required_data, function(){
   if(the string of text was included)
   {
      pass it as a parameter in the socket emit event
   }
 }, 
 function(){
    if(the image was included)
    {
      pass it as a parameter in the socket emit event
    }
 });