2015-06-14 29 views
5

Mam klasę, która rozszerza BroadcastReceiver. Po odebraniu wiadomości SMS chciałbym przekazać informacje do mojej głównej klasy aktywności, aby wyświetlić tekst w polu (Dołącz, jeśli już jest obecny tekst).Wysyłanie zamiaru z klasy BroadcastReceiver do aktualnie działającej działalności

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")); 
     } 

} 

mam tylko jedną klasę działalności (MainActivity.java). Jednak gdy to zrobię, otrzymuję wyjątek Nie można wstrzymać aktywności.

Odpowiedz

8

Masz trzy sposoby:
1) można zdefiniować swoją transmisję wewnątrz MainActivity tak:
w onCreate()

registerReceiver(smsReceiver, new IntentFilter(SMS_RECIEVED)); 

i definiują smsReciver w MainActivity

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

zdefiniować runnable zaktualizować interfejs użytkownika:

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

i metody aktualizacji

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

2) Zarejestruj odbiornik pomiędzy aktywności i BroadCastReceiver

3) zaczynają swoją działalność o nowe intencyjny zaktualizować bieżący otwarty Aktywny

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

UPDATE :
wyjaśnić metodę 2
MainActivity.class

w onResume()

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

w onDestroy()

unregisterReceiver(broadcastReceiver); 

miejscowego nadawaniu (broadcastReceiver w 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
globalny atrybut

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

w onReceive()

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

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

this.intent = new Intent(BROADCAST_ACTION); 

zdefiniować dwa metoda

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

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

Jak wysłać wiadomość z klasy SmsReceiver.Napisałem następujący kod: Intent i = new Intent ("SMS_RECIEVED"); i.putExtra ("updatedString", str); LocalBroadcastManager mgr = LocalBroadcastManager.getInstance (kontekst); mgr.sendBroadcast (i); – user1692342

+0

w jaki sposób chcesz użyć? 1 lub 2 lub 3? – MHP

+0

Próbuję metody 1 – user1692342

0

Zmienić poniżej swój kod.