0

簡単な質問があります。

メイン アクティビティでテキスト ビューを宣言し、XML ( ) から作成しましたfindViewById。この値をブロードキャスト レシーバのサブクラスに渡したいと思います。以下は、私の Broadcast コンストラクターです。

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 に答える