将值从活动传递到广播接收器时的NullPointerExceptoin

时间:2013-02-06 12:02:18

标签: java android android-activity broadcastreceiver

我有一个简单的问题。

我在主活动中声明了文本视图,并从XML(findViewById)创建了它。我想将此值传递给广播接收器的子类。以下是我的Broadcast构造函数:

public Broadcast(TextView text_dBm) {   
    this.text_dBm = text_dBm;   
}

在我的主要活动中,我创建了一个新的广播对象,并在其中传递我的textview值,如下所示:

new Broadcast(text_dBm);

但是我的text_dBm上仍然出现空指针异常。无论如何(除了静态方法)在活动和广播接收器之间传递值?

哦,是的。我的广播接收器以编程方式(在服务中)注册,并且运行良好。

感谢您的时间!

P.S:我已经在SO中检查了一些线程,但我没有找到答案: How to pass value from an activity in an broadcast receiver?

主要活动类:

public class MainActivity extends Activity {
    TextView text_dBm, text_time, text_rssi;
    Intent startServiceFromActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text_dBm = (TextView) findViewById(R.id.textView_dBm);

        new Broadcast(text_dBm);
        startServiceFromActivity = new Intent(this, WifiService.class);
        startService(startServiceFromActivity); 
    }
}

广播接收器类:

public class Broadcast extends BroadcastReceiver {
    WifiInfo wifiInfo;
    WifiManager wifiManager_service;
    TextView text_dBm;

    public Broadcast(WifiManager wifiManager_service) { 
        this.wifiManager_service = wifiManager_service; 
    }

    public Broadcast(TextView text_dBm) {       
        this.text_dBm = text_dBm;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("RECEIVER", "Receiver running"); // LOG   

        text_dBm.setText("textview"); // nullpointerexception
    }
}

2 个答案:

答案 0 :(得分:2)

通过意图传递数据

活动 -

Intent i = new Intent(Activity.this, Broadcast.class);
Bundle b = new Bundle();
b.putString("key", "value");
i.putExtras(b);
startActivity(i);

在您的广播接收器类onReceive方法

@Override
public void onReceive(Context context, Intent intent) 
{
    String result = intent.getString("key");
    // your method
}

答案 1 :(得分:2)

您无法使用Intent传递视图。要做你想做的事,你需要你的广播接收器成为你活动的内在阶层。当活动开始在活动停止时取消注册时,应注册接收者。否则你会泄漏记忆。这意味着您只能在活动屏幕上实际收到消息。

如果您需要能够在活动之外接收广播,则需要:

  1. 在清单中注册您的接收者以进行特定操作(或在服务中注册,但不要忘记取消注册)
  2. 启动活动并使用额外的意图
  3. 传递要在textview中显示的消息
  4. 当活动开始时,检查意图是否包含要在textview中显示的任何内容并执行必要的

  5. 来自你的评论:

    1. 将接收器创建为活动的内部类(不是静态的,因此它可以访问活动的TextView实例)
    2. 在onStart中注册接收器
    3. 在onStop中取消注册接收器
    4. 在接收器的onReceive方法中执行:textView.setText(intent.getStringExtra(“dbm”));
    5. 服务通过传递一个名为“dbm”的额外意图并包含您要显示的文本
    6. 来发送广播

      -

      public class MainActivity extends Activity {
      
        @Override
        protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          dbmView = (TextView) findViewById(R.id.textView_dBm);
        }
      
        @Override
        protected void onStart() {
          super.onStart();
          IntentFilter intentFilter = new IntentFilter("com.example.broadcasts.DBM_UPDATE");
          registerReceiver(receiver, intentFilter);
        }
      
        @Override
        protected void onStop() {
          unregisterReceiver(receiver);
          super.onStop();
        }
      
        private TextView dbmView;
      
        private BroadcastReceiver receiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              dbmView.setText(intent.getStringExtra("dbm"));
          }
        }
      
      }
      

      在服务中:

      Intent i = new Intent("com.example.broadcasts.DBM_UPDATE");
      i.putExtra("dbm", "it works!");
      sendBroadcast(i);