0

我有一个简单的问题。

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

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

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

new Broadcast(text_dBm);

但我的text_dBm. 无论如何(除了静态方法)在活动和广播接收器之间传递值吗?

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

感谢您的时间!

PS:我已经在 SO 中检查了一些线程,但我没有找到答案: 如何从广播接收器中的活动传递值?

主要活动类:

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

2 回答 2

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
}
于 2013-02-06T12:06:46.627 回答
2

您不能使用 Intents 传递视图。为了做你想做的事,你需要你的广播接收器成为你活动的内部类。接收者应该在活动开始注册,在活动停止时取消注册。否则你会泄漏内存。这意味着您只能在实际在活动屏幕本身上接收消息。

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

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

从您的评论中:

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

-

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);
于 2013-02-06T12:16:46.067 回答