【问题标题】:Android BroadcastReceiver : get object from onReceive methodAndroid BroadcastReceiver:从 onReceive 方法获取对象
【发布时间】:2023-03-27 18:32:01
【问题描述】:

我正在尝试将一个包含 Wi-Fi 信息的数组列表从一个从 BroadcastReceiver 扩展到另一个类的类中传递。我可以使用 getter 在两个类之间传递一个普通的变量。但是我得到一个空数组,因为 onReceive 方法没有执行。我想在另一个类中执行 onReceive 方法(但我不能实例化它)或者在另一个类的 onReceive 方法中创建数组使用吸气剂(但我无法获取列表)。请问如何在第二类中获取此数组。

这是 WifiData 类

public class WifiData extends BroadcastReceiver{
List<String[]> wifiValues = new ArrayList<String[]>();
WifiManager wifi;
Button      enab;
String resultsString ; 
String[] myStringArray;
int aa = 10;
 int a=10 ;
 List<String[]>  getWifi (){
    return wifiValues ;
}

@Override
public void  onReceive(Context context, Intent intent) {


    if(intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)){
        List<ScanResult> results = wifi.getScanResults();

        resultsString = results.toString() ;


        for(int i=0;i<results.size();i++){

            Log.i("Wifi SSID",results.get(i).level+"");
            wifiValues.add(new String[] { results.get(i).level +"" });
        }

     }

}

}

这是必须获取 wifi 信息并创建图表的 SalesStackedBarChart 类:

    public class SalesStackedBarChart extends AbstractDemoChart {

  public Intent execute(Context context) {

      WifiData wi = new WifiData ();

    //  values.add(new double[] {wi.getWifi() });
      Log.i("aaaa",wi.getWifi()+"");
     }
} 

谢谢。

【问题讨论】:

  • 这个类是否作为 Activity 或 Fragment 的一部分存在?
  • SalesStackedBarChart 类是一个活动,WifiData 类是一个简单的类,我想在后台执行 WifiData 类@shimi_tap

标签: android arrays class broadcastreceiver wifi


【解决方案1】:

您正在尝试使用 AChartEngine 在图表中显示数据,对吗? 创建一个新活动并将图表放在该布局中。阅读here如何使用AChartEngine。

现在,当您将数据从第一个类(活动)传递到第二个类(活动)时,您可以使用意图传递数据。使用 intent.putExtras() 向 Intent 添加额外内容。首先创建一个包。在该包中使用适当的方法(如putSerializableExtra() or putParcelableExtra())放入数据,并在第二个类(活动)中调用 getIntent 并将该意图捕获到临时变量中。

从中您可以使用 intent.getExtras().getSerializableExtra() 等检索数据。您可以将数据加载到 AChartEngine 数据中以显示为图表。

【讨论】:

  • 对,我正在使用 achartengine,但我想从 SalesStackedBarChart 类中的 WifiData 中获取数据以显示它们。我需要数据来显示它@upenpat
  • 我需要在buckground中执行onReceive方法,我只使用一种布局来显示图表。
  • 这就是你的 onReceive 方法应该是这样的@Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)){ List&lt;ScanResult&gt; results = wifi.getScanResults(); Intent i = new Intent(context, SalesStackedBarChartActivity.class); Bundle b = new Bundle(); b.putSerializable("data", results); i.putExtras(b); startActivity(i); } }
  • 谢谢@upenpat,但是SalesStackedBarChartActivity 怎么知道必须执行onReceive 方法呢?不是出于本意吗?
  • 这就是我要告诉你的。创建一个具有布局的活动,该布局将充当您尝试绘制的图形的容器布局。阅读我在之前的帖子中给出的链接
【解决方案2】:

这是一个可行的解决方案: 从 WifiActivity 活动开始,将确定 wifi 扫描列表,并将其发送到 TruitonAChartEngineActivity 类。

WifiActivity 活动

public class WifiActivity extends Activity  {
       /** Called when the activity is first created. */
    WifiManager wifi;
    Button      enab;
    String resultsString ; 
    String[] myStringArray;
    int aa = 10;
    //tableau pris à partir de http://www.radio-electronics.com/info/wireless/wi-fi/80211-channels-number-frequencies-bandwidth.php
    int [ ] [ ] Center_Frequency_2 = {   { 1,2,3,4,5,6,7,8,9,10,11,12,13,14 },
                                       { 2412, 2417, 2422, 2427, 2432,2437,2442,2447,2452 ,2457,2462,2467,2472,2484},
                                   };



    public class Receiver extends BroadcastReceiver{



        @Override
        public void onReceive(Context context, Intent intent) {



            if(intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)){
                final List<ScanResult> results = wifi.getScanResults();

                resultsString = results.toString() ;
                Log.i("resultsString*****************",resultsString);
                final String [ ] [ ] chanelRssi = new String [results.size()][2];



            String[] tabResults = new String[results.size()];
            for(int i=0;i<results.size();i++){  
                if  (results.get(i).frequency /1000 == 2) {
                    for (int j =0;j<14;j++)
                    { if (Center_Frequency_2[1][j] == results.get(i).frequency)
                tabResults[i]=results.get(i).SSID +" (" + results.get(i).BSSID + ") \n"+ results.get(i).frequency +"\n"+ results.get(i).level +"\n"+ results.get(i).capabilities +"\n"+"canal "+Center_Frequency_2[0][j] ;
                    chanelRssi[i][0]=Center_Frequency_2[0][j]+"";
                    chanelRssi[i][1]=results.get(i).level +"";

                    }
                    }
                }
            Button send = (Button) findViewById(R.id.barChartButton);
            send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("click","click");
                    Toast.makeText(getApplicationContext(),
                            "Position :"+resultsString , Toast.LENGTH_LONG)
                            .show();

                    Intent intent1 = new Intent (getApplicationContext(),TruitonAChartEngineActivity.class); 
                    Bundle bundleObject = new Bundle();
                    bundleObject.putSerializable("key", (Serializable) results);
                    intent1.putExtras(bundleObject);
                    startActivityForResult(intent1,0);


                /*  Intent intent1 = new Intent (getApplicationContext(),TruitonAChartEngineActivity.class);
                    startActivityForResult(intent1,0);*/

                }
            });



             }



        }

        private void startActivities(Intent intent, int i) {
            // TODO Auto-generated method stub

        }


    }


    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wifi);
        ConnectivityManager cxMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);

       Receiver receiver = new Receiver();
        registerReceiver(receiver,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        registerReceiver(receiver,new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

    }



}

还有 TruitonAChartEngineActivity 类

public class TruitonAChartEngineActivity extends ActionBarActivity {

private static final int SERIES_NR = 2;
String message1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_truiton_achart_engine);
    XYMultipleSeriesRenderer renderer = getTruitonBarRenderer();
    myChartSettings(renderer);
    Bundle v = getIntent().getExtras();
    ArrayList<ScanResult> classObject = (ArrayList<ScanResult>) v.getSerializable("key");
     // message1 = v.getString("message1");
    /* Toast.makeText(getApplicationContext(),
             "Position :" , Toast.LENGTH_LONG)
             .show();*/
    /* Toast.makeText(getApplicationContext(),
             "Position classObject :"+classObject , Toast.LENGTH_LONG)
             .show();*/
     for(int index = 0; index < classObject.size(); index++){

            String  Object = classObject.get(index).level+"";
            Toast.makeText(getApplicationContext(), "Id is :"+Object, Toast.LENGTH_SHORT).show();
        }

     Intent intent = ChartFactory.getBarChartIntent(this, getTruitonBarDataset(), renderer, Type.DEFAULT);
        startActivity(intent);

}}

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多