BroadcastReceiver(廣播接收器)是Android中的四大組件之一,專注于接收廣播通知信息,并做出對應處理的組件。
廣播接收主要有兩種,一種是用戶發送的廣播,另外一種是系統的廣播消息的接收,包括用戶來電、用戶短信和攔截黑名單電話等。這里我們所要說的廣播接收是監聽我們自己注冊的普通廣播的一個接收。
使用廣播接收需完成:
(1)注冊廣播:注冊方式有兩種,一種是在AndroidManifest.xml文件中定義,指定該BroadcastReceiver所響應的Intent的Action;另一種是使用代碼進行指定,調用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法指定;這兩種注冊方式都需要IntentFIlter。
(2)發送廣播:調用Context的sendBroadcast來發發送指定的BroadcastReceiver,也就是使用Intent來傳遞注冊時用到的Action。
(3)接收廣播:當發送的廣播被廣播接收器監聽到之后,BroadcastReceiver的onReceive()方法將會被觸發,從而在該方法中顯示廣播所攜帶的信息或者進行一些簡單的操作。
為此我也做了一個簡單的Dome,按照慣例先來看一下最終效果圖:
MainActivity.class
package com.example.xiaolijuan.broadcastdome;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
/**
* @author: xiaolijuan
* @description:
* @projectName: BroadcastDome
* @date: 2016-01-20
* @time: 23:28
*/
public class MainActivity extends Activity implements View.OnClickListener {
private Button btn;
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
textview = (TextView) findViewById(R.id.code);
btn.setOnClickListener(this);
RegisterBroadCase();
}
/**
* 廣播注冊
*/
private void RegisterBroadCase() {
submitReceiver receiver = new submitReceiver();
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getApplicationContext());
IntentFilter filter = new IntentFilter();
filter.addAction(SecondActivity.INTEGRAL_BROADCAST);
lbm.registerReceiver(receiver, filter);
}
public class submitReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (intentAction.equals(SecondActivity.INTEGRAL_BROADCAST)) {
textview.setText(intent.getExtras().getString("afterCode"));
}
}
}
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("code", textview.getText()); //獲取積分,將他保存在intent里面
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
}
SecondActivity.class
package com.example.xiaolijuan.broadcastdome;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
* @author: xiaolijuan
* @description:
* @projectName: BroadcastDome
* @date: 2016-01-20
* @time: 23:28
*/
public class SecondActivity extends Activity implements View.OnClickListener{
public static final String INTEGRAL_BROADCAST = "INTEGRAL_BROADCAST";
TextView currentCode;
EditText editText;
Button sureBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
currentCode = (TextView) findViewById(R.id.currentCode); //當前的積分,把傳過來的數據綁定在textview控件
currentCode.setText(getIntent().getStringExtra("code")); //設置當前的積分
editText = (EditText) findViewById(R.id.editText);
sureBtn = (Button) findViewById(R.id.sure);
sureBtn.setOnClickListener(this);
}
/**
* 發送廣播信息
*/
public void sendMessage(String afterCode) {
Intent intent = new Intent();
intent.putExtra("afterCode", afterCode);
intent.setAction(INTEGRAL_BROADCAST);
LocalBroadcastManager l = LocalBroadcastManager
.getInstance(SecondActivity.this);
l.sendBroadcast(intent);
}
@Override
public void onClick(View v) {
String afterCode = editText.getText().toString();
if(TextUtils.isEmpty(afterCode)) {
Toast.makeText(SecondActivity.this, "更改積分不能為空!", Toast.LENGTH_SHORT).show();
} else {
currentCode.setText(afterCode);
sendMessage(afterCode);
}
}
}
在使用的時候,需要注意:使用了LocalBroadcastManager注冊廣播之后,在發送廣播的時候要使用LocalBroadcastManager.sendBroadcast(intent),否則會接收不到廣播。
項目源碼 點擊下載