探索廣播接收器的使用

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),否則會接收不到廣播。
項目源碼 點擊下載

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容