0

How can i pass data from SMS broadcast receiver to it's relevant fragment to update data . i had created one demo in which i had 7 different fragments in which there are different kinds of status are pass. i had created inner broadcast receiver but it is not good idea because when sms is arrived it call all inner classes so i want to create on broadcast receiver class and then on sms received i want to update data i also want to store them in data base and if fragment is currently open then update status on it like change button color on sms status change from ON to OFF.

i had put onReceive() method of sms broadcast receiver kindly help me.

 @Override
            public void onReceive(Context context, Intent intent) 
            {
                db = new DataBaseHandler(context);
                Bundle bundle = intent.getExtras();
                if (bundle != null) {
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    final SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++) {
                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

                        if (messages[i].getOriginatingAddress().equalsIgnoreCase("+91XXXXXXXXXX"))
                            systemnumber = true;
                    }
                    if (systemnumber) 
                    {
                        if (messages.length > 0) 
                        {
                            StringBuffer content = new StringBuffer();
                            for (SmsMessage sms : messages)
                                content.append(sms.MessageBody());
                            mySmsText = content.toString();
                        }
                        if(mySmsText.length() == 125)
                        {
                            // here i want to pass data from broadcast receiver to it's relevant fragment
                        }
                        else if(mySmsText.length() == 231 && mySmsText.replaceAll(" +", " ").split("\\n|\\s")[0].equals("ON"))
                        {
                            // here i want to pass data from broadcast receiver to it's relevant fragment
}                               }                   
                    } else
                }
            }
Madhav_nimavat
  • 401
  • 5
  • 19
  • U may try some kind of event bus, Otto, EventBus etc – darwin Nov 25 '16 at 12:05
  • I had never work with broadcast receiver and sms so i don't have any idea on it. – Madhav_nimavat Nov 25 '16 at 12:06
  • Check this link https://github.com/greenrobot/EventBus – darwin Nov 25 '16 at 12:07
  • ok i'll check it. and one more thing currently i register it in manifest , then should i have to unregister it or not and my sms are come at any time there is no fix schedule of it. – Madhav_nimavat Nov 25 '16 at 12:09
  • Receive the SMS and process it. Then send it to the relevant Broadcast Receiver (one per class) and broadcast to the relevant one. See http://stackoverflow.com/questions/8802157/how-to-use-localbroadcastmanager – Roy Falk Nov 25 '16 at 12:11
  • If you not unregistered from broadcast receiver, then app will be notified about all the sms status – darwin Nov 25 '16 at 12:11
  • i have particular number and i want to receive sms only from that number – Madhav_nimavat Nov 25 '16 at 12:13
  • So, u must listen for all incoming sms and check the sender number in on receive of broadcast receiver – darwin Nov 25 '16 at 12:15
  • yeah currently i do samething like that i listen all sms then if number match to specific number then i update data but it call all my inner broadcast receiver so i don't wanna to it. – Madhav_nimavat Nov 25 '16 at 12:18
  • can anyone have other solution exclude EventBus. – Madhav_nimavat Nov 25 '16 at 12:32
  • //i put this code inside broadcast receiver Intent intents = new Intent(BROADCAST_ACTION); intent.putExtra("key", mySmsText); context.sendBroadcast(intents); and then inside my demo activity registerReceiver(smsReceiver, new IntentFilter(BROADCAST_ACTION)); register it and then inside onReceive i print it but it return null – Madhav_nimavat Nov 25 '16 at 12:57

1 Answers1

0

Finally i done it... // this is main broadcast receiver class

public void onReceive(Context context, Intent intent) 
    {
        db = new DataBaseHandler(context);
        Bundle bundle = intent.getExtras();
        if (bundle != null) 
        {
            Object[] pdus = (Object[]) bundle.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];
            for (int i = 0; i < pdus.length; i++) 
            {
                messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

                if (messages[i].getOriginatingAddress().equalsIgnoreCase("+XXXXXXXXXXXX"))
                    systemnumber = true;
            }
            if (systemnumber) 
            {
                if (messages.length > 0) 
                {
                    StringBuffer content = new StringBuffer();
                    for (SmsMessage sms : messages)
                        content.append(sms.getMessageBody());
                    mySmsText = content.toString();

                    Log.d("My-sms-text", "" + mySmsText);
                }
                Log.d("My-sms-length", "" + mySmsText.length());

                if(mySmsText.equalsIgnoreCase("ABC"))
                {

                    Intent i = new Intent("broadCastOne");
                    // Data you need to pass to activity
                    db.update_sys_pwd(mySmsText);
                    i.putExtra("message", mySmsText);                  
                    context.sendBroadcast(i);
                    Log.d("Call demo1","Demo1");
                }
                else if(mySmsText.equalsIgnoreCase("DEF"))
                {
                    Bundle extras = intent.getExtras();
                    Intent i = new Intent("broadCastTwo");
                    // Data you need to pass to activity
                    db.update_sys_pwd(mySmsText);
                    i.putExtra("message", mySmsText); 
                    context.sendBroadcast(i);
                    Log.d("Call demo2","Demo2");
                }

            } 

        }
    }

// to register inside activity i do something like below

registerReceiver(broadcastReceiver, new IntentFilter("broadCastOne"));
//now i create broadcast receiver inside class
    private BroadcastReceiver broadcastReceiver =  new BroadcastReceiver() {           
            @Override
            public void onReceive(Context context, Intent intent) 
            {          
                Bundle b = intent.getExtras();
                Log.d("Inside Demo1","Demo1");
               final String message = b.getString("message");

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        updateUi(message);      
                        Log.d("inside demoActivity","Inside runnable");
                    }
                });               
                Log.d("newmesage", "" + message);
            }
        };

// below method is used for update UI if currently activity open otherwise it store them inside database .

public void updateUi(String message)
    {
        db.update_sys_pwd(message);
        t1.setText(message);        
        Log.d("Inside Demo1","Update UI");
    }

kindly if any wrong please tell me so i can better update it ...

Madhav_nimavat
  • 401
  • 5
  • 19