欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android BroadcastReceiver傳輸機制詳解

 更新時間:2023年01月31日 08:45:44   作者:劉知意  
Android開發(fā)的四大組件分別是:活動(activity),用于表現功能;服務(service),后臺運行服務,不提供界面呈現;廣播接受者(Broadcast Receive),勇于接收廣播;內容提供者(Content Provider),支持多個應用中存儲和讀取數據,相當于數據庫,本篇著重介紹廣播組件

Broadcast

應用程序之間傳輸信息的機制

BroadcastReceiver

接收來自系統和應用中的廣播

作用:在特定時間發(fā)送特定的標識,讓程序進行操作

使用方法

注:

  • BroadcastReceiver生命周期只有十秒左右
  • BroadcastReceiver里不能做一些比較耗時的操作
  • 應該通過Intent給Service,有Service完成
  • 不能使用子線程

廣播的種類

普通廣播(Normal broadcasts)

所有監(jiān)聽該廣播的廣播接收者都可以監(jiān)聽到該廣播

特點:

  • 同級別接收先后是隨機的
  • 級別低的后收到廣播
  • 接收器不能截斷廣播的繼續(xù)傳播也不能處理廣播
  • 同級別動態(tài)注冊高于靜態(tài)注冊
package com.example.broadcastsdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void doclick(View view) {
        switch (view.getId()){
            case R.id.send1: //發(fā)送一條普通廣播
                Intent intent = new Intent();
                intent.putExtra("msg","這是一條普通廣播");
                intent.setAction("BC_MSG");
                intent.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC1"));
                sendBroadcast(intent);
                Log.e("TAG", "doclick: 點擊發(fā)送廣播");
            break;
        }
    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center|top"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:onClick="doclick"
        android:id="@+id/send1"
        android:text="發(fā)送一條普通廣播"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

BC1

package com.example.broadcastsdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BC1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.e("TAG", "BC1接收到的廣播信息 "+msg);
    }
}

高版本需要用intent.setComponent指定接收者包路徑和類路徑

如果需要發(fā)給多個類廣播,就使用intent.setPackage(“com.example.broadcastsdemo”);

同一包下的BroadcastReceiver都可以接收到廣播

設置優(yōu)先級

<receiver android:name=".BC1"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="100">
        <action android:name="BC_MSG"/>
    </intent-filter>
</receiver>
<receiver android:name=".BC2"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="400">
        <action android:name="BC_MSG"/>
    </intent-filter>
</receiver>

只需要在intent-filter中設置android:priority就可以了

值-1000到1000越大優(yōu)先級越高

截斷廣播

public class BC2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.e("TAG", "BC2接收到的廣播信息 "+msg);
        abortBroadcast();
    }
}

使用 abortBroadcast();關鍵字

發(fā)現普通廣播無法中斷廣播的發(fā)送

靜態(tài)注冊是在xml中注冊

動態(tài)注冊

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    IntentFilter intentFilter = new IntentFilter("BC_MSG");
    BC2 bc2 = new BC2();
    registerReceiver(bc2,intentFilter);
}

動態(tài)注冊大于靜態(tài)注冊,但是他的作用域太低,容易死掉

測試BC1發(fā)廣播BC2收

public class BC1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.e("TAG", "BC1接收到的廣播信息 "+msg);
        Bundle bundle = new Bundle();
        bundle.putString("test","廣播處理的數據BC1");
        setResultExtras(bundle);
    }
}
public class BC2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.e("TAG", "BC2接收到的廣播信息 "+msg);
       // abortBroadcast();
        Bundle bundle = getResultExtras(true);
        String test = bundle.getString("test");
        Log.e("TAG", "BC2得到的數據"+test );
    }
}

發(fā)現普通廣播無法傳送數據

有序廣播(ordered broadcasts)

按照接收者的優(yōu)先級順序接收廣播,優(yōu)先級在intent-filter中的priority中聲明。-1000到1000之間,值越大,優(yōu)先級越高??梢越K止廣播意圖的繼續(xù)傳播,接收者可以篡改內容

特點:

  • 同級別接收順序是隨機的
  • 能截斷廣播的繼續(xù)傳播,高級別的廣播接收器收到該廣播后,可以決定把該廣播是否截斷
  • 接收器能截斷廣播的繼續(xù)傳播,也能處理廣播
  • 同級別動態(tài)注冊高于靜態(tài)注冊

添加按鈕

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center|top"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:onClick="doclick"
        android:id="@+id/send1"
        android:text="發(fā)送一條普通廣播"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:onClick="doclick"
        android:id="@+id/send2"
        android:text="發(fā)送一條有序廣播"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

添加事件處理

case R.id.send2: //發(fā)送一條普通廣播
    Intent intent2 = new Intent();
    intent2.putExtra("msg","這是一條有序廣播");
    intent2.setAction("BC_MSG");
    //intent.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC1"));
    intent2.setPackage("com.example.broadcastsdemo");
    sendOrderedBroadcast(intent2,null);
    Log.e("TAG", "doclick: 點擊發(fā)送有序廣播");
    break;

發(fā)現有序廣播可以實現BC2發(fā)消息給BC1,且可以中斷廣播

異步廣播(粘滯性滯留廣播)

不能將處理結果傳給下一個接收者,無法終止廣播

添加按鈕及事件

<Button
    android:onClick="doclick"
    android:id="@+id/send3"
    android:text="發(fā)送一條異步廣播"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
case R.id.send3: //發(fā)送一條異步廣播
    Intent intent3 = new Intent();
    intent3.putExtra("msg","這是一條有序廣播");
    intent3.setAction("BC_MSG");
    //intent3.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC3"));
    intent3.setPackage("com.example.broadcastsdemo");
    sendStickyBroadcast(intent3);
    IntentFilter intentFilter = new IntentFilter("BC_MSG");
    BC3 bc3 = new BC3();
    registerReceiver(bc3,intentFilter);
    break;

可以發(fā)送和接收分開,先發(fā)送再接收

發(fā)送完廣播要卸載

到此這篇關于Android BroadcastReceiver傳輸機制詳解的文章就介紹到這了,更多相關Android BroadcastReceiver 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • ExpandableListView實現手風琴效果

    ExpandableListView實現手風琴效果

    這篇文章主要為大家詳細介紹了ExpandableListView實現手風琴效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 100行Android代碼輕松實現帶動畫柱狀圖

    100行Android代碼輕松實現帶動畫柱狀圖

    這篇文章主要教大家通過100行Android代碼輕松實現帶動畫柱狀圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • RxJava之網絡請求最常見的三種場景

    RxJava之網絡請求最常見的三種場景

    本文想闡述一下當你開發(fā)Android應用并采用RxJava作為你的架構,尤其是有關網絡請求時最常見的三種場景。這篇文章主要介紹了RxJava之網絡請求最常見的三種場景,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android基于騰訊云實時音視頻仿微信視頻通話最小化懸浮

    Android基于騰訊云實時音視頻仿微信視頻通話最小化懸浮

    這篇文章主要為大家詳細介紹了Android基于騰訊云實時音視頻實現類似微信視頻通話最小化懸浮,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android開發(fā)Flutter?桌面應用窗口化實戰(zhàn)示例

    Android開發(fā)Flutter?桌面應用窗口化實戰(zhàn)示例

    這篇文章主要為大家介紹了Android開發(fā)Flutter?桌面應用窗口化實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Android RippleDrawable 水波紋/漣漪效果的實現

    Android RippleDrawable 水波紋/漣漪效果的實現

    這篇文章主要介紹了Android RippleDrawable 水波紋/漣漪效果的實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Android分享微信小程序失敗的一些事小結

    Android分享微信小程序失敗的一些事小結

    這篇文章主要給大家介紹了關于Android分享微信小程序失敗一些事,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Android 給控件添加邊框陰影效果

    Android 給控件添加邊框陰影效果

    這篇文章主要介紹了Android 給控件添加邊框陰影效果,文中代碼部分top代表下邊的陰影高度,left代表右邊的陰影寬度。具體實例代碼大家參考下本文
    2017-11-11
  • 基于Android實現數獨游戲

    基于Android實現數獨游戲

    這篇文章主要為大家詳細介紹了基于Android實現數獨游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 學習使用Material Design控件(二)使用DrawerLayout實現側滑菜單欄效果

    學習使用Material Design控件(二)使用DrawerLayout實現側滑菜單欄效果

    這篇文章主要為大家介紹了學習使用Material Design控件的詳細教程,使用DrawerLayout和NavigationView實現側滑菜單欄效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論