web-dev-qa-db-ja.com

BroadcastReceiverクラスから現在実行中のアクティビティへのインテントの送信

BroadcastReceiverを拡張するクラスがあります。 SMSを受信したら、メインのアクティビティクラスに情報を渡して、テキストをボックスに表示したいと思います(テキストが既に存在する場合は追加します)。

public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
    {
        Intent i = new Intent(context, MainActivity.class);
            i.putExtra("updatedString","Hello");
            context.startActivity(i);
    }
}

MainActivity.Java

public class MainActivity extends Activity{

  private TextView results;
  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Bundle extras = getIntent().getExtras();
        if(extras!=null){
            results = (TextView) findViewById(R.id.results);
            results.setVisibility(View.VISIBLE);
            results.append(extras.getString("updatedString"));
        }

}

アクティビティクラスは1つだけです(MainActivity.Java)。ただし、これを行うと、アクティビティを一時停止できないという例外が発生します。

8
user1692342

3つの方法があります。
1)MainActivity内でブロードキャストを次のように定義できます。
in onCreate()

_registerReceiver(smsReceiver, new IntentFilter(SMS_RECIEVED));  
_

MainActivityでsmsReciverを定義します

_private BroadcastReceiver smsReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //you can update textBox here
        handler.postDelayed(sendUpdatesToUI, 10);  
    }
};  
_

uIを更新するためのランナブルを定義する

_private Runnable sendUpdatesToUI = new Runnable() {
    public void run() {
        update();
    }
};
_

と更新方法

_private void update(String text) {
    textView.setText(textView.getText().toString() + text);
} 
_

2)アクティビティとBroadCastReceiverの間にレシーバーを登録します

3)現在開いているアクティビティを更新する新しいインテントでアクティビティを開始します

_Intent intent = new Intent(context, MainActivity.class);
intent.putExtra("Key", "text");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);  
_

更新:
方法2を説明する
MainActivity.class

onResume()

_registerReceiver(broadcastReceiver, new IntentFilter(SmsReceiver.BROADCAST_ACTION));  
_

onDestroy()

_unregisterReceiver(broadcastReceiver);
_

ローカルbroadCast(broadcastReceiver、MainActivity.class内)

_private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateUI(intent);
    }
};
private void updateUI(Intent intent) {
    String text = intent.getStringExtra("key");
    textView.setText(textView.getText().toString() + text);
}
_

SmsReceiver.class
グローバル属性

_public static final String BROADCAST_ACTION = "your.package.name.displayevent";
private final Handler handler = new Handler();
Intent intent;
Context context;
_

onReceive()

_handler.removeCallbacks(sendUpdatesToUI);
handler.postDelayed(sendUpdatesToUI, 10);

this.context = context;//you can retrieve context from onReceive argument

this.intent = new Intent(BROADCAST_ACTION);
_

2つの方法を定義する

_private Runnable sendUpdatesToUI = new Runnable() {
    public void run() {
        display();
    }
};

private void display() {
    intent.putExtra("key", text);
    context.sendBroadcast(intent);
}
_
10
MHP

以下のようにコードを変更します。

 public class SmsReceiver extends BroadcastReceiver {
@Override 

public void onReceive(Context context, Intent intent)
    { 
        Intent i = new Intent(context, MainActivity.class);
            i.putExtra("updatedString","Hello");            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
            context.startActivity(i);
    } 
}

public class MainActivity extends Activity{

  private TextView results;
  @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Bundle extras = getIntent().getExtras();
        if(extras!=null){
            results = (TextView) findViewById(R.id.results);
            results.setVisibility(View.VISIBLE);
            results.append(extras.getString("updatedString"));
        } 

@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
      //handle your intent here.Note this will be called even when activity first created.so becareful to handle intents correctly.
    }

}
0
siva