如何在服务和活动之间发送/接收广播

3

我需要从SmsReceiver类向我的主要活动发送消息,但无法做到。我尝试了很多并搜索了一番,但是......

以下是我的代码

SmsReceiver.java

public class SmsReceiver extends BroadcastReceiver {

    // Get the object of SmsManager
    final SmsManager sms = SmsManager.getDefault();

    public void onReceive(Context context, Intent intent) {

        // Retrieves a map of extended data from the intent.
        final Bundle bundle = intent.getExtras();

        try {

            if (bundle != null) {

                final Object[] pdusObj = (Object[]) bundle.get("pdus");

                for (int i = 0; i < pdusObj.length; i++) {

                    SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    String phoneNumber = currentMessage.getDisplayOriginatingAddress();

                    String senderNum = phoneNumber;
                    String message = currentMessage.getDisplayMessageBody();
                    Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);

                    Intent intent1=new Intent(context, MainActivity.class);

                    intent1.putExtra("m",message);
                    context.sendBroadcast(intent1);
                } // end for loop
            } // bundle is null

        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" +e);

        }

    }    
}

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
               final EditText intext=(EditText) findViewById(R.id.editText2Inputtext);

          BroadcastReceiver mysms=new BroadcastReceiver() {
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                String sms=arg1.getExtras().getString("m");
                intext.setText(sms);

            }
        };
    }
}
2个回答

5
您发送和注册广播接收器的代码不正确。 发送广播:
Intent intent = new Intent("your_action_name");
intent.putExtra(....);
sendBroadcast(intent);

接收:

BroadcastReceiver mysms=new BroadcastReceiver() {
      @Override
      public void onReceive(Context arg0, Intent arg1) {
          String sms=arg1.getExtras().getString("m");
          intext.setText(sms);

      }
};
registerReceiver(mysms, new IntentFilter("your_action_name"));

同时,在销毁活动时记得取消注册。


-1

不要使用 context.sendBroadcast(intent1);,你应该尝试使用 context.startActivity(intent1);

试一下这个

Intent i = new Intent(context,Main.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(i);

sendBroadCast 用于发送广播意图。在您的情况下,您需要启动一个活动,因此您需要在上下文中使用您的活动意图调用 startActivity。 - nizammoidu
它正确地重新打开了main_Activity,但没有显示短信文本。 - user3649691
请记住,您正在循环内部启动活动,这可能会导致问题。您能否更新您的代码? - nizammoidu
此外,您不需要在活动中使用广播接收器,因为它永远不会被调用。您可以尝试在活动的onCreate方法中使用getIntent().getExtras().getString("m");来获取数据。 - nizammoidu
我应该说,当收到新短信时,我不想再次打开Main_Activity,而是希望在收到新消息时更新Main_Activity。请专注于这个主题,我认为应该在Main_Activity中使用一个继承自broadcastReceiver的内部类来实现! - user3649691
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接