2016-05-12 3 views
0

私はBroadcastReceiverからグローバルなアクティビティ変数(静的にすることはできません)にアクセスしようとしています。そのために、私は活動のインスタンスこうして作成:CでSystem.InvalidCastExceptionを取得する

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

をしかし、私はSystem.InvalidCastExceptionの取得:指定されたキャストは有効ではありません。インスタンス作成行で何が間違っているのですか?

EDIT:私の活動のいくつかのコード

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(); 
     } 
     ... 
    } 

そしてより広範な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

なぜコンテキストを 'MainActivity'にキャストしたいのですか? –

+0

'ApplicationContext'は' Activity'' Contextではなく、 'MainActivity'ではありません。あなたはあなたがしようとしていることをすることはできません。 –

+0

この行にエラーが発生していますか? - 'MainActivityアクティビティ=(MainActivity)context.ApplicationContext; ' –

答えて

0

私は、私が開発した、以前のアプリで別の活動からMainActivityプロパティを呼び出すために覚えているが、私は」あなたがStartScan()でしようとするような関数を呼び出すことはできません。 私が通常使用するオプションは、シリアル化されたデータを格納し、メインで呼び出すことです。あなたが直接

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

これは、1つのデータを保持します行うことができます私はあなたのOnCreate関数では、ストア機能 に呼び出して、あなたのOnReceive機能で

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

: 私のようないくつかのメソッドを持つクラスを行いますBroadcastReceiverを呼び出した後に永続性データを消去したくない場合は、