日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限

發(fā)布時間:2024/9/27 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


1? BroadcastAndroid中的四大組件之一,他的用途很大,比如系統(tǒng)的一些廣播:電量低、開機、鎖屏等一些操作都會發(fā)送一個廣播。

2? 廣播被分為兩種不同的類型:普通廣播(Normalbroadcasts有序廣播(Ordered broadcasts)”.普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有廣播接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結(jié)果傳遞給下一個接收者,并且無法終止廣播Intent的傳播;然后有序廣播是按照接收者聲明的優(yōu)先級別(聲明在intent-filter元素的android:priority)屬性中,數(shù)越大優(yōu)先級別越高,取值范圍:-10001000。也可以調(diào)用IntentFilter對象的setPriority()進行設置),被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么,廣播先傳A,在傳給B,最后傳給CA得到廣播后,可以往廣播里存入數(shù)據(jù),當廣播傳給B時,B可以從廣播中得到A存入的數(shù)據(jù)。

?

Context.sendBroadcast()

發(fā)送的是普通廣播,所有訂閱者都有機會獲得并進行處理。

Context.sendOrderedBroadcast()

發(fā)送的是有序廣播,系統(tǒng)會根據(jù)接收者聲明的優(yōu)先級按順序逐個執(zhí)行接收者,前面的接收者有權(quán)終止廣播(通過調(diào)用BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將處理結(jié)果存進廣播Intent,然后傳給下一個接收者。

?

編寫以下案例:

3 編寫Android清單文件

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

??? package="com.itheima.broadcasttest"

??? android:versionCode="1"

??? android:versionName="1.0" >

?

??? <uses-sdk

??????? android:minSdkVersion="8"

??????? android:targetSdkVersion="19" />

?

??? <application

??????? android:allowBackup="true"

??????? android:icon="@drawable/ic_launcher"

??????? android:label="@string/app_name"

??????? android:theme="@style/AppTheme" >

??????? <activity

??????????? android:name="com.itheima.broadcasttest.MainActivity"

??????????? android:label="@string/app_name" >

??????????? <intent-filter>

??????????????? <action android:name="android.intent.action.MAIN" />

?

??????????????? <category android:name="android.intent.category.LAUNCHER" />

??????????? </intent-filter>

??????? </activity>

???????

??????? <receiver android:name="com.itheima.broadcasttest.Level1Receiver" >

??????????? <intent-filter android:priority="1000" >

??????????????? <action android:name="com.itheima.broadcasttest.songwennuan" />

??????????? </intent-filter>

??????? </receiver>

??????? <receiver android:name="com.itheima.broadcasttest.Level2Receiver" >

??????????? <intent-filter android:priority="500" >

??????????????? <action android:name="com.itheima.broadcasttest.songwennuan" />

??????????? </intent-filter>

??????? </receiver>

??????? <receiver android:name="com.itheima.broadcasttest.Level3Receiver" >

??????????? <intent-filter android:priority="100" >

??????????????? <action android:name="com.itheima.broadcasttest.songwennuan" />

??????????? </intent-filter>

??????? </receiver>

??????? <receiver android:name="com.itheima.broadcasttest.FinalReceiver" >

??????????? <intent-filter android:priority="0" >

??????????????? <action android:name="com.itheima.broadcasttest.songwennuan" />

??????????? </intent-filter>

??????? </receiver>

??? </application>

?

</manifest>

4 編寫布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

??? xmlns:tools="http://schemas.android.com/tools"

??? android:orientation="vertical"

??? android:layout_width="match_parent"

??? android:layout_height="match_parent"

??? tools:context=".MainActivity" >

???

??? <Button

??????? android:onClick="send1"

??????? android:layout_width="fill_parent"

??????? android:layout_height="wrap_content"

??????? android:text="發(fā)送無序廣播" />

?

??? <Button

??????? android:onClick="send2"

??????? android:layout_width="fill_parent"

??????? android:layout_height="wrap_content"

??????? android:text="發(fā)送有序廣播" />

???

</LinearLayout>

5 編寫一下廣播接收者

Level1Receiver

package com.itheima.broadcasttest;

?

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

?

public class Level1Receiver extends BroadcastReceiver {

???????? private static final String TAG = "Broadcasttest";

????????

???????? @Override

???????? public void onReceive(Context context, Intent intent) {

?????????????????? String message = getResultData();

?????????????????? Log.i(TAG,"省級部門得到中央的消息:" + message);

?????????????????? abortBroadcast();? //這里是終止了消息,可以關閉或者取消這里查看LogCat中打印的效果。

?????????????????? setResultData("給農(nóng)民兄弟發(fā)5000塊錢");

???????? }

?

}

Level2Receiver

package com.itheima.broadcasttest;

?

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

?

public class Level2Receiver extends BroadcastReceiver {

???????? private static final String TAG = "Broadcasttest";

????????

???????? @Override

???????? public void onReceive(Context context, Intent intent) {

?????????????????? String message = getResultData();

?????????????????? Log.i(TAG,"市級部門得到省級的消息"? + message);

?????????????????? setResultData("給農(nóng)民兄弟發(fā)2000塊錢");

???????? }

?

}

Level3Receiver

package com.itheima.broadcasttest;

?

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

?

public class Level3Receiver extends BroadcastReceiver {

???????? private static final String TAG = "Broadcasttest";

????????

???????? @Override

???????? public void onReceive(Context context, Intent intent) {

?????????????????? String message = getResultData();

?????????????????? Log.i(TAG, "鄉(xiāng)級部門得到市的消息:" + message);

?????????????????? setResultData("給農(nóng)民兄弟發(fā)兩大大米");

???????? }

?

}

FinalReceiver

package com.itheima.broadcasttest;

?

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

?

public class FinalReceiver extends BroadcastReceiver {

???????? private static final String TAG = "Broadcasttest";

????????

???????? @Override

???????? public void onReceive(Context context, Intent intent) {

?????????????????? String message = getResultData();

?????????????????? Log.i(TAG, "農(nóng)民兄弟得到鄉(xiāng)的消息:" + message);

???????? }

}

6 MainActivity的內(nèi)容如下:

package com.itheima.broadcasttest;

?

import android.content.Intent;

import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;

import android.view.View;

?

public class MainActivity extends ActionBarActivity {

?

???????? @Override

???????? protected void onCreate(Bundle savedInstanceState) {

?????????????????? super.onCreate(savedInstanceState);

?????????????????? setContentView(R.layout.activity_main);

???????? }

?

???????? /**

???????? ?* 發(fā)送無序廣播

???????? ?* @param view

???????? ?*/

???????? public void send1(View view) {

?????????????????? Intent intent = new Intent();

?????????????????? intent.setAction("com.itheima.broadcasttest.songwennuan");

?????????????????? intent.putExtra("msg", "發(fā)1萬塊");

?????????????????? //無序廣播,不可被攔截,不可終止

?????????????????? sendBroadcast(intent);

???????? }

????????

???????? public void send2(View view) {

?????????????????? Intent intent = new Intent();

?????????????????? intent.setAction("com.itheima.broadcasttest.songwennuan");

?????????????????? //有序廣播,可被攔截,可終止,可以修改數(shù)據(jù)

?????????????????? sendOrderedBroadcast(intent, null,new FinalReceiver(),null,0,"給農(nóng)民兄弟發(fā)10000塊錢",null);

???????? }

}

運行:

點擊發(fā)送無序廣播按鈕,在LogCat中打印出的內(nèi)容如下:

點擊發(fā)送有序廣播按鈕,在LogCat中打印出的內(nèi)容如下:

之所以在Level1Receiver執(zhí)行了abortBroadcast()后還顯示下面一條,是因為指定了之中廣播:

//有序廣播,可被攔截,可終止,可以修改數(shù)據(jù)

sendOrderedBroadcast(intent, null,new FinalReceiver(),null,0,"給農(nóng)民兄弟發(fā)10000塊錢",null);

若把Level1Receiver改成如下時:

package com.itheima.broadcasttest;

?

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

?

public class Level1Receiver extends BroadcastReceiver {

???????? private static final String TAG = "Broadcasttest";

????????

???????? @Override

???????? public void onReceive(Context context, Intent intent) {

?????????????????? String message = getResultData();

?????????????????? Log.i(TAG,"省級部門得到中央的消息:" + message);

?????????????????? //abortBroadcast();? //這里是終止了消息,可以關閉或者取消這里查看LogCat中打印的效果。

?????????????????? setResultData("給農(nóng)民兄弟發(fā)5000塊錢");

???????? }

}

點擊發(fā)送有序廣播后顯示的內(nèi)容如下:

==========================================================================

關于有序廣播的另外的一個案例:

1、編寫第一個廣播MyOrderBroadcastReciver

package com.demoorderbroadcast;

?

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

?

public class MyOrderBroadcastReciver extends BroadcastReceiver {

?

???????? private static final String TAG = "BroadCast";

????????

???????? @Override

???????? public void onReceive(Context context, Intent intent) {

?????????????????? String strMsg = intent.getStringExtra("msg");

?????????????????? Log.i(TAG, "第一個:" + strMsg);

?????????????????? //通過Bundle傳遞參數(shù)

?????????????????? Bundle extras = new Bundle();

?????????????????? extras.putString("msg", "第一個界面?zhèn)鬟^來的" + strMsg);

?????????????????? setResultExtras(extras);//繼續(xù)向下傳

???????? }

}

2 編寫第二個廣播MyOrderBroadcastReciverTwo

package com.demoorderbroadcast;

?

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

?

public class MyOrderBroadcastReciverTwo extends BroadcastReceiver {

?

???????? private static final String TAG = "BroadCast";

????????

???????? @Override

???????? public void onReceive(Context context, Intent intent) {

?????????????????? //abortBroadcast();? //開啟此處,可以截斷廣播,不讓它傳到third

?????????????????? String strMsg = intent.getStringExtra("msg");?? //獲取廣播的原始數(shù)據(jù)

??????????????????

?????????????????? Log.i(TAG, "第二個界面?zhèn)鬟^來的" + strMsg);

?????????????????? Bundle extras = new Bundle();

?????????????????? extras.putString("msg", "第二個界面?zhèn)鬟^來的" + strMsg);

?????????????????? setResultExtras(extras); //繼續(xù)向下傳

??????????????????

?????????????????? //"第二個:"+strMsg這是two中新的數(shù)據(jù),傳遞到third,

?????????????????? //third中是用getResultData來獲得setResultData("")中的數(shù)據(jù)

?????????????????? setResultData("第二個:" + strMsg);

???????? }

????????

}

3 編寫第三個廣播MyOrderBroadcastReciverThird

package com.demoorderbroadcast;

?

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

?

public class MyOrderBroadcastReciverThird extends BroadcastReceiver {

??? private static final String TAG = "BroadCast";

???

??? @Override

??? public void onReceive(Context context, Intent intent) {

?????? //獲得twosetResultData中的數(shù)據(jù)

?????? String resultData = getResultData();

?????? //獲取twosetResultExtras中的數(shù)據(jù)

?????? Bundle bundle = getResultExtras(true);

?????? //獲取廣播的原始數(shù)據(jù)

?????? String bundleData = bundle.getString("msg");

??????

?????? //獲取廣播的原始數(shù)據(jù)

?????? String strMsg = intent.getStringExtra("msg");

?????? Log.i(TAG, "第三個:" + strMsg);

??????

?????? Log.i(TAG,"two中傳遞到third新的數(shù)據(jù):" + resultData);

?????? Log.i(TAG, "twosetResultExtras(extras)傳到third新的數(shù)據(jù):" + bundleData);

??? }

}

4 編寫MainActivity,代碼如下:

package com.demoorderbroadcast;

?

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

?

public class MainActivity extends Activity {

?

???????? private Button btnSendOrderBroadCast;

????????

???????? protected void onCreate(Bundle savedInstanceState) {

?????????????????? super.onCreate(savedInstanceState);

?????????????????? setContentView(R.layout.activity_main);

?????????????????? initView();

???????? }

????????

???????? private void initView() {

?????????????????? btnSendOrderBroadCast = (Button) this.findViewById(R.id.btn);

?????????????????? btnSendOrderBroadCast.setOnClickListener(new MyOnclickListener());

???????? }

?

???????? private class MyOnclickListener implements OnClickListener {

?

?????????????????? public void onClick(View v) {

??????????????????????????? if (btnSendOrderBroadCast==v) {

???????????????????????????????????? sendOrderBroadCast();

??????????????????????????? }

?????????????????? }

???????? }

?

???????? public void sendOrderBroadCast() {

?????????????????? Intent intent = new Intent("com.pzf.mybroadcast");

?????????????????? intent.putExtra("msg", "toto ni hao");

?????????????????? sendOrderedBroadcast(intent, "com.pzf.permission");

???????? }

}

5 編寫Android的清單文件AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

??? package="com.demoorderbroadcast"

??? android:versionCode="1"

??? android:versionName="1.0" >

?

??? <uses-sdk

??????? android:minSdkVersion="8"

??????? android:targetSdkVersion="19" />

??? <permission android:name="com.pzf.permission" android:protectionLevel="normal"></permission>

??? <uses-permission android:name="com.pzf.permission"/>

???

??? <application

??????? android:allowBackup="true"

??????? android:icon="@drawable/ic_launcher"

??????? android:label="@string/app_name"

??????? android:theme="@style/AppTheme" >

??????? <activity

??????????? android:name="com.demoorderbroadcast.MainActivity"

??????????? android:label="@string/app_name" >

??????????? <intent-filter>

??????????????? <action android:name="android.intent.action.MAIN" />

?

??????????????? <category android:name="android.intent.category.LAUNCHER" />

??????????? </intent-filter>

??????? </activity>

??????? <receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciver">

??????????? <intent-filter android:priority="1000">

??????????????? <action android:name="com.pzf.mybroadcast"></action>

??????????? </intent-filter>

??????? </receiver>

??????? <receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciverTwo">

??????????? <intent-filter android:priority="900">

??????????????? <action android:name="com.pzf.mybroadcast"></action>

??????????? </intent-filter>

??????? </receiver>

??????? <receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciverThird">

??????????? <intent-filter android:priority="800">

??????????????? <action android:name="com.pzf.mybroadcast"></action>

??????????? </intent-filter>

??????? </receiver>

??? </application>

</manifest>

當點擊發(fā)送有序廣播時,LogCat中打印的內(nèi)容如下:

?

總結(jié)

以上是生活随笔為你收集整理的17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。