2015-06-14 11 views
5

Ich habe eine Klasse, die BroadcastReceiver erweitert. Nach Erhalt einer SMS möchte ich Informationen an meine Hauptaktivitätsklasse weitergeben, um den Text in einem Feld anzuzeigen (Anhängen, wenn bereits Text vorhanden ist).Sendender Intent von der BroadcastReceiver-Klasse zur aktuell laufenden Aktivität

public class SmsReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) 
    { 
     Intent i = new Intent(context, MainActivity.class); 
      i.putExtra("updatedString","Hello"); 
      context.startActivity(i); 
    } 
} 

MainActivity.java

public class MainActivity extends Activity{ 

    private TextView results; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Bundle extras = getIntent().getExtras(); 
     if(extras!=null){ 
      results = (TextView) findViewById(R.id.results); 
      results.setVisibility(View.VISIBLE); 
      results.append(extras.getString("updatedString")); 
     } 

} 

ich nur eine Aktivitätsklasse haben (MainActivity.java). Aber wenn ich dies tue, bekomme ich eine Ausnahme, die Aktivität nicht pausieren kann.

Antwort

8

Sie haben drei Möglichkeiten:
in onCreate()

registerReceiver(smsReceiver, new IntentFilter(SMS_RECIEVED)); 

und definieren smsReciver in MainActivity

private BroadcastReceiver smsReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //you can update textBox here 
     handler.postDelayed(sendUpdatesToUI, 10); 
    } 
}; 

definieren ein lauffähiges:
1) Sie können Ihre Sendung in Ihrem MainActivity wie folgt definieren zu aktualisieren UI

private Runnable sendUpdatesToUI = new Runnable() { 
    public void run() { 
     update(); 
    } 
}; 

und Update-Methode

private void update(String text) { 
    textView.setText(textView.getText().toString() + text); 
} 

2)

3) Starten Sie Ihre Aktivität mit neuem Intent einen Empfänger zwischen Aktivität und BroadCastReceiver Registrieren aktuelle offen Aktivität

Intent intent = new Intent(context, MainActivity.class); 
intent.putExtra("Key", "text"); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(intent); 

UPDATE zu aktualisieren :
erklären Methode 2
MainActivity.class

in onResume()

registerReceiver(broadcastReceiver, new IntentFilter(SmsReceiver.BROADCAST_ACTION)); 

in onDestroy()

unregisterReceiver(broadcastReceiver); 

lokalen BROADCAST (broadcastReceiver, in MainActivity.class)

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     updateUI(intent); 
    } 
}; 
private void updateUI(Intent intent) { 
    String text = intent.getStringExtra("key"); 
    textView.setText(textView.getText().toString() + text); 
} 

SmsReceiver.class
globalAttribut

public static final String BROADCAST_ACTION = "your.package.name.displayevent"; 
private final Handler handler = new Handler(); 
Intent intent; 
Context context; 

in onReceive()

handler.removeCallbacks(sendUpdatesToUI); 
handler.postDelayed(sendUpdatesToUI, 10); 

this.context = context;//you can retrieve context from onReceive argument 

this.intent = new Intent(BROADCAST_ACTION); 

definieren zwei Verfahren

private Runnable sendUpdatesToUI = new Runnable() { 
    public void run() { 
     display(); 
    } 
}; 

private void display() { 
    intent.putExtra("key", text); 
    context.sendBroadcast(intent); 
} 
+0

Wie schicke ich die Nachricht von SmsReceiver Class.Ich habe folgenden Code geschrieben: Absicht i = neue Absicht ("SMS_RECIEVED"); i.putExtra ("updatedString", str); LocalBroadcastManager mgr = LocalBroadcastManager.getInstance (Kontext); mgr.sendBroadcast (i); – user1692342

+0

Welchen Weg möchten Sie nutzen? 1 oder 2 oder 3? – MHP

+0

Ich versuche Methode 1 – user1692342

0

wie unten Ändern Sie Ihren Code.

public class SmsReceiver extends BroadcastReceiver { 
@Override 

public void onReceive(Context context, Intent intent) 
    { 
     Intent i = new Intent(context, MainActivity.class); 
      i.putExtra("updatedString","Hello");   i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
      context.startActivity(i); 
    } 
} 

public class MainActivity extends Activity{ 

    private TextView results; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Bundle extras = getIntent().getExtras(); 
     if(extras!=null){ 
      results = (TextView) findViewById(R.id.results); 
      results.setVisibility(View.VISIBLE); 
      results.append(extras.getString("updatedString")); 
     } 

@Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     //handle your intent here.Note this will be called even when activity first created.so becareful to handle intents correctly. 
    } 

}