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
)。ただし、これを行うと、アクティビティを一時停止できないという例外が発生します。
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);
}
_
以下のようにコードを変更します。
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.
}
}