Android广播机制学习

                                                                                                            Android广播

Android广播机制

广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。

Android广播类型分类

1)无序广播:任何一个广播接收者都可以接收到广播,任何一个广播接收者都不能截断广播

2)有序广播:任何一个广播接收者都可以截断广播,一旦广播给截断,那么下一个接收者将无法接收广播。有序广播按照优先级来接收

3)粘黏广播:粘性广播在发送后就一直存在于系统的广播容器里面,等待对应的接收者去处理,如果暂时没有接收者处理这个广播则一直在广播容器里面处于等待状态。

广播的生命周期

 

广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它

即为失活状态。

广播接收器属于主线程,广播接收器内部不能执行耗时任务。广播接收器如同主

UI线程一样,不能执行耗时任务,一般情况下广播接收器的执行时间为15秒。

 

Android广播机制三要素

广播(Broadcast) - 用于发送广播

广播接收器(BroadcastReceiver) - 用于接收广播

意图内容(Intent)-用于保存广播相关信息的媒介

 

下面的例子演示有序广播:

Mainactivity

package com.py.main;

import com.py.broadcast.R;

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.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

/**

 * 有序广播实例:有序广播可以是静态注册也可以是动态注册,本activity使用动态注册;

 * 权限的设置可以是自定义的权限,亦可使用null。自定义权限在Androidmanifest.xml中设置

 * @author py

 *

 */

public class MainActivity extends Activity {

    

Button btnorder;   //有序广播按钮

DataBoardCast1 dataBoardCast1 = new DataBoardCast1();  //有序广播1

DataBoardCast2 dataBoardCast2 = new DataBoardCast2();  //有序广播2

//广播1

class DataBoardCast1 extends BroadcastReceiver{

@Override

public void onReceive(Context arg0, Intent intent) {

// TODO Auto-generated method stub

Log.i("TAG""DataBoardCast1");

Log.i("TAG""DataBoardCast1"+intent.getStringExtra("key"));

}

}

//广播2

class DataBoardCast2 extends BroadcastReceiver{

@Override

public void onReceive(Context arg0, Intent intent) {

// TODO Auto-generated method stub

Log.i("TAG""DataBoardCast2");

Log.i("TAG""DataBoardCast2"+intent.getStringExtra("key"));

//阻截后面的广播接收者接收

this.abortBroadcast();

}

}

OnClickListener btnClickListener = new OnClickListener() {

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

orderBy();   //传递有序广播的方法

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btnorder = (Button)this.findViewById(R.id.button2);

btnorder.setOnClickListener(btnClickListener);

//接收广播的 intent action

IntentFilter iFilter1 = new IntentFilter("com.py.broadcast.acton_broadcast");

iFilter1.setPriority(100);                   //设置广播的优先级

this.registerReceiver(dataBoardCast1, iFilter1);  //动态注册广播1

IntentFilter iFilter2 = new IntentFilter("com.py.broadcast.acton_broadcast");

iFilter2.setPriority(10000);

this.registerReceiver(dataBoardCast2, iFilter2); //动态注册广播2

}

protected void orderBy() {

// TODO Auto-generated method stub 

Intent intent = new Intent();    //创建意图

intent.setAction("com.py.broadcast.acton_broadcast");  //设置自定义action

intent.putExtra("key""py");          //传递数据

//使用上下文对象和自定义权限发送有序广播

this.sendOrderedBroadcast(intent, "com.py.broadcast.permission.py");

//this.sendOrderedBroadcast(intent, null);   权限可以设置为空

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

this.unregisterReceiver(dataBoardCast1); //使用上下文注销广播12

this.unregisterReceiver(dataBoardCast2);

super.onDestroy();

}

}

 

如果定义了自定义权限,则要在Androidmanifest.xml中注册权限:

<!-- 自定义权限对象 ,最好带上包名,避免冲突;自定义权限也可以不设置-->

    <permission android:name="com.py.broadcast.permission.py" 

                 android:protectionLevel="normal">

    </permission>

    <!-- 添加权限 -->

<uses-permission android:name="com.py.broadcast.permission.py"/>

 

 

下面的例子来演示无序广播:

广播发送者MainActivity2

package com.py.main;

import com.py.broadcast.R;

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;

/**

 * 无序广播实例:有序广播可以是静态注册也可以是动态注册,本activity使用静态注册;

 * 权限的设置可以是自定义的权限,亦可使用null。自定义权限在Androidmanifest.xml中设置

 * @author py

 *

 */

public class MainActivity2 extends Activity {

    

Button btnorder;   //无序广播按钮

OnClickListener btnClickListener = new OnClickListener() {

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

orderBy();   //传递无序广播的方法

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btnorder = (Button)this.findViewById(R.id.button1);

btnorder.setOnClickListener(btnClickListener);

}

/*protected void orderBy() {

// TODO Auto-generated method stub 

Intent intent = new Intent();    //创建意图

intent.setAction("com.py.broadcast.acton_broadcast2");  //设置自定义action

intent.putExtra("key", "py");          //传递数据

this.sendBroadcast(intent);   //使用上下文无序广播

}  

*/

//发送无序广播,具备权限【广播发送者】

protected void orderBy() {

Intent intent = new Intent();

intent.setAction("com.py.broadcast.acton_broadcast2");  //设置自定义action

intent.putExtra("key""py");

// 使用<permission>声明权限对象

this.sendBroadcast(intent,"com.py.broadcast.permission.py");

}

}

 

广播接收者DataBroadcastReceive

package com.py.broadcast;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

 

//如果使用AndroidManifest.xml静态注册,最好使用外部类,而不使用内部类

//使用内部类的,内部类必须是public static的,AndroidManifest.xml中才可以实例化

public class DataBroadcastReceive extends BroadcastReceiver{

 

@Override

public void onReceive(Context arg0, Intent intent) {

// TODO Auto-generated method stub

    Log.i("TAG", intent.getStringExtra("key"));

}

}

 

广播静态注册,在Androidmanifest.xml中设置:

<receiver android:name="com.py.broadcast.DataBroadcastReceive" >

            <intent-filter >

                <action android:name="com.py.broadcast.acton_broadcast2" >

                </action>

            </intent-filter>

        </receiver>

 

总结:

无序广播跟有序广播都可以静态注册或者动态注册。采取静态注册,当用户一打开程序,便会广播。即使用户立刻退出,仍然还会广播内容。比如一个提示信息。这影响了用户的使用。所以采取动态注册,程序员就可以控制广播的注销。

无序广播跟有序广播都可以采取不用权限的方式或者使用自定义权限的方式进行广播。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI语言模型,我只能提供一些Android开发的基础知识和常用概念,希望对您有所帮助。 1. Android组成部分 Android操作系统由四个主要组成部分组成:应用程序、应用程序框架、系统运行库和硬件抽象层。 2. Activity Activity是Android应用程序中的一个组件,用于表示应用程序中的一个屏幕。Activity可以包含用户界面元素,如文本框、按钮和图像。 3. Intent Intent是Android应用程序中的一个基本组件,用于在不同的组件之间传递数据。Intent可以用于启动Activity、启动服务、发送广播等。 4. 布局 布局是Android应用程序中用于定义用户界面的XML文件。布局文件定义了应用程序中的视图层次结构,包括文本框、按钮、图像等。 5. AndroidManifest.xml AndroidManifest.xml是Android应用程序中的一个必需文件,用于描述应用程序的基本信息。该文件包含应用程序的包名、应用程序的入口Activity、应用程序需要的权限等信息。 6. 生命周期 Android应用程序中的每个组件都有自己的生命周期,包括创建、启动、暂停和销毁。了解组件的生命周期可以帮助开发者更好地管理应用程序的资源。 7. 线程 Android应用程序中的线程用于执行长时间运行的操作,如下载文件或执行计算。但是,在主线程中执行长时间运行的操作会导致应用程序变得缓慢或停止响应,因此必须使用异步线程。 8. Service Service是Android应用程序中的一种组件,用于在后台执行长时间运行的操作。与Activity不同,Service没有用户界面,可以在后台执行。 9. 广播 广播Android应用程序中的一种机制,用于在不同组件之间传递消息。广播可以用于通知应用程序中的其他组件,例如当设备电池电量低时,应用程序可以发送广播通知其他组件。 10. 内存管理 内存管理是Android应用程序中的一个重要方面。Android应用程序必须管理内存以确保应用程序能够正常运行,并避免出现内存泄漏和内存溢出等问题。可以使用垃圾回收器、使用合适的数据结构、避免创建不必要的对象等方法来管理内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值