2016-05-12 11 views
0

Ich versuche, auf globale Aktivitätsvariablen (die ich nicht als statisch machen kann) von einem BroadcastReceiver zuzugreifen. Dafür habe ich eine Instanz der Aktivität auf diese Weise erstellen:Abrufen von System.InvalidCastException in C#

class wifiReceiver : BroadcastReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     MainActivity activity = (MainActivity)context.ApplicationContext; 
     ... 

aber ich bekomme System.InvalidCastException: Die angegebene Umwandlung ist ungültig. in der Instanzerstellungszeile. Was mache ich falsch?

EDIT: Einige Code meiner Tätigkeit

public class MainActivity : Activity 
{ 
    private WifiManager _manager; 
    private List<string> _wifiSignals; 
    private wifiReceiver _wifiReceiver; 
    private TextView _Text; 

    protected override void OnCreate(Bundle bundle) 
    { 
     ... 
     _wifiReceiver = new wifiReceiver(); 
     _manager = (WifiManager)GetSystemService(Context.WifiService); 
     _wifiSignals = new List<string>(); 

     if (_manager.IsWifiEnabled) 
     { 
      _manager.StartScan(); 
     } 
     ... 
    } 

und umfangreicheren Code aus BroadcastReceiver:

public override void OnReceive(Context context, Intent intent) 
     { 
      MainActivity activity = (MainActivity)context.ApplicationContext; 
      activity._wifiSignals.Clear(); 
      activity._wifiSignals.Add("Lista de wifi:\n"); 
      IList<ScanResult> wifiScanList = activity._manager.ScanResults; 
      foreach (ScanResult wifiNetwork in wifiScanList) 
      { 
       activity._wifiSignals.Add(wifiNetwork.Ssid + ": " + wifiNetwork.Level); 
      } 

      //activity.presentation(activity._wifiSignals, activity); 
      activity._manager.StartScan(); 
     } 
+0

Warum möchten Sie Context in 'MainActivity' umwandeln? –

+0

'ApplicationContext' ist kein' Activity' 'Context', und es ist insbesondere nicht' MainActivity'. Du kannst nicht tun, was du versuchst zu tun. –

+0

Erhalten Sie Fehler für diese Zeile? - 'MainActivity activity = (MainActivity) context.ApplicationContext; ' –

Antwort

0

Obwohl ich erinnere mich MainActivity Eigenschaften von anderen Aktivitäten in früheren Anwendungen entwickelte ich anrufen, ich Ich bin mir ziemlich sicher, dass Sie keine Funktion aufrufen können, wie Sie es mit dem StartScan() versuchen. Die Option, die ich normalerweise verwende, ist, die serialisierten Daten zu speichern und sie in Main aufzurufen. ich eine Klasse mit einigen Methoden wie:

class persistence 
{ 
    ISharedPreferences prefs; 
    ISharedPreferencesEditor editor; 

    public persistence(Context cont) 
    { 
     prefs = PreferenceManager.GetDefaultSharedPreferences(cont); 
     editor = prefs.Edit(); 
    } 
    public void store(List<articulo> articulos) 
    { 
     string raw = JsonConvert.SerializeObject(articulos); 
     editor.PutString("articulos", raw); 
     editor.Commit(); 
    } 

    public List<articulo> recover() 
    { 
     string raw = prefs.GetString("articulos", null); 
     List<articulo> lista; 
     if (raw == null) 
      lista = new List<articulo>(); 
     else 
      lista = JsonConvert.DeserializeObject<List<articulo>>(raw); 
     return lista; 
    } 
} 

In Ihrer OnReceive Funktion I In Ihrer Funktion OnCreate in den Laden-Funktion aufrufen, können Sie direkt von einem Dies wird auch Daten halten

persistence datos; 
protected override void OnCreate(Bundle bundle) 
{ 
    _wifiReceiver = new wifiReceiver(); 
    _manager = (WifiManager)GetSystemService(Context.WifiService); 
    datos = new persistence (this); 
    _wifiSignals = datos.recover(); 
    if(_wifiSignals.Count>0) 
     StartScan(); 
} 

tun Verwendung zu einem anderen, wenn Sie die Persistenzdaten nach dem Aufruf des BroadcastReceivers nicht löschen möchten;