廣播

廣播是一種廣泛運用在應用程序之間傳輸信息的機制,android中的廣播用於監聽系統事件或應用程序事件!android中的廣播包括普通廣播、有序廣播以及異步廣播(粘性廣播)!

廣播又有常駐型廣播和非常駐型廣播,常駐型廣播是在xml中進行註冊的,當應用程序關閉後,如果有對應的廣播發送過來,廣播接收器還是能夠被激活;非常駐型廣播是在代碼中進行註冊的,當應用程序關閉,廣播也就取消了,我們可以在Activity中的onCreate或者onResume方法中註冊廣播,然後在onDestory或者onPause方法中取消註冊廣播;

注意:如果是非常駐型廣播,應用程序關閉後,必須取消註冊廣播,否則會拋出異常!!

普通廣播的發送

普通廣播的發送使用方式:

sendBroadcast(Intent intent):intent表示意圖,所有匹配該廣播的意圖都能收到該廣播信息

sendBroadcast(intent, String receiverPermission);intent與上面一樣,receiverPermission表示權限,與之匹配權限的廣播才能接收到相應的廣播,如果爲null,表示不經許可的要求!

發送者: MainActivity.java頁面

package com.zking.administrator.g160628_android21_sender;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText et_main_content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_main_content = (EditText) findViewById(R.id.et_main_content);
    }
    public void send(View view){
        //拿到內容
        String content=et_main_content.getText().toString();
        //發送廣播
        //兩種類型的廣播 ——1.有序廣播   2.無序廣播
        Intent intent=new Intent();
        //指定廣播的名字(不能隨便寫,它要用包名,點後面的可以隨便寫)
        intent.setAction("com.zking.administrator.g160628_android21_sender.hui");
        //指定廣播內容
        intent.putExtra("content",content);
//        sendBroadcast(intent);//發送無序廣播
        //發送無序黏性廣播 (發送黏性廣播必須寫權限)
        //黏性廣播:退出程序再打開就能接收到,就跟QQ的離線消息一樣,發是可以發,當你一上線就能接收到
//        sendStickyBroadcast(intent);

        //發送有序廣播
        sendOrderedBroadcast(intent,null);
    }
}

AndroidManifest.xml(如果你要使用黏性廣播就必須寫權限)

<!--黏性廣播權限-->
    <uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission>

activity_main.xml頁面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.zking.administrator.g160628_android21_sender.MainActivity">

   <EditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/et_main_content"
       android:hint="請輸入要發送的內容"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="發送"
        android:onClick="send"/>
</LinearLayout>

接收者1:MainActivity.java頁面(這個是使用代碼的動態廣播註冊)

package com.zking.administrator.g160628_android21_receiver01;

import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private MyReceiver01 myReceiver01;
    private IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myReceiver01 = new MyReceiver01();
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.zking.administrator.g160628_android21_sender.hui");
        //動態優先級在Java代碼中設置(有序)
        intentFilter.setPriority(998);
    }

    //都是靜態時誰先安裝就水先運行,如果有一個是動態有一個是靜態的話,動態的優先級要比靜態的優先級高
    //靜態廣播退出應用程序依然能接收到內容,動態廣播退出應用程序就接收不到
    @Override
    protected void onResume() {
        super.onResume();
        //動態:註冊廣播
        registerReceiver(myReceiver01,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消註冊,只要你註冊了你就必須取消知註冊,不然它會報一個錯誤說你沒有取消註冊
        unregisterReceiver(myReceiver01);
    }
}

MyReciver01.java頁面

package com.zking.administrator.g160628_android21_receiver01;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * Created by Administrator on 2017/7/11.
 */

public class MyReceiver01 extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        //獲取廣播的名字
        String action=intent.getAction();
        //判斷,如果一樣就獲取廣播的內容
        if("com.zking.administrator.g160628_android21_sender.hui".equals(action)){
            //獲取廣播內容(無序廣播)
//            String content=intent.getStringExtra("content");
            //獲取結果(有序廣播)
            Bundle bundle=getResultExtras(true);//是否能夠拿到,設置它爲true
            String content=bundle.getString("newContent");
            Log.i("test","廣播接收者1號"+content);
        }
    }
}

接收者2:配置頁面(這裏是在XML中)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zking.administrator.g160628_android21_receiver02">

    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true" android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--註冊:廣播接受者
       動態註冊:使用Java代碼設置
       靜態註冊:在XML文件重配置-->
        <receiver android:name=".MyReceiver02">
            <!--android:priority="有序廣播"取值範圍在-1000到1000中,取值越大優先級越高-->
            <intent-filter
                android:priority="1000">
                <action android:name="com.zking.administrator.g160628_android21_sender.hui"></action>
            </intent-filter>
        </receiver>
    </application>
</manifest>

MyReceiver02.java頁面

package com.zking.administrator.g160628_android21_receiver02;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * Created by Administrator on 2017/7/11.
 */

public class MyReceiver02 extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        //獲取廣播的名字
        String action=intent.getAction();
        //判斷,如果一樣就獲取廣播的內容
        if("com.zking.administrator.g160628_android21_sender.hui".equals(action)){
            //獲取廣播內容
            String content=intent.getStringExtra("content");
            Log.i("test","廣播接收者2號"+content);


            //判斷,廣播的內容是’呵呵‘就不往下傳不了,如果不是’呵呵‘就往下傳播
            if(content.contains("呵呵")){
                //不傳播
                abortBroadcast();//阻止廣播繼續傳播,abortBroadcast必須寫在優先級高的裏面,如果寫在低級的就沒什麼價值了
            }
            //改變廣播的內容 ,設置結果
            Bundle bundle=new Bundle();
            bundle.putString("newContent",content+",開玩笑的!!!");
            setResultExtras(bundle);
        }
    }
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章