广播接收者 BroadcastReceiver 示例-2
BaseActivity
/**所有Activity的基类*/public class BaseActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityCollector.addActivity(this);}@Overrideprotected void onDestroy() {super.onDestroy();ActivityCollector.removeActivity(this);}}
MainActivity
public class MainActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i("MainActivity", "++++++onCreate");TextView textView = new TextView(this);textView.setGravity(Gravity.CENTER);textView.setText("请登录");textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(MainActivity.this, SecondActivity.class));}});setContentView(textView);}@Overrideprotected void onDestroy() {super.onDestroy();Log.i("MainActivity", "++++++onDestroy");}@Overridepublic void finish() {super.finish();Log.i("MainActivity", "++++++finish");}}
SecondActivity
public class SecondActivity extends BaseActivity {private MyLocalReceiver localReceiver;//本地广播的管理器,该机制发出的广播只会在APP内部传播,且广播接收者也只能收到本APP发出的广播!本地广播无法通过静态方式注册,相比起系统全局广播更加高效private LocalBroadcastManager localBroadcastManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView textView = new TextView(this);textView.setText("发送本地广播");textView.setGravity(Gravity.CENTER);setContentView(textView);localReceiver = new MyLocalReceiver();IntentFilter intentFilter = new IntentFilter(MyActions.MY_BROADCAST_ACTION_LOGIN_OTHER);//可以通过addAction()方法添加多个ActionlocalBroadcastManager = LocalBroadcastManager.getInstance(this);localBroadcastManager.registerReceiver(localReceiver, intentFilter);//注册广播接收者,设置过滤器textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {localBroadcastManager.sendBroadcast(new Intent(MyActions.MY_BROADCAST_ACTION_LOGIN_OTHER));}});}@Overrideprotected void onDestroy() {super.onDestroy();localBroadcastManager.unregisterReceiver(localReceiver);Log.i("SecondActivity", "++++++onDestroy");}@Overridepublic void finish() {super.finish();Log.i("SecondActivity", "++++++finish");}}
Activity管理类
/** 一个用于在应用退出时关闭所有Activity的容器管理类 */public class ActivityCollector {private static List<Activity> activities = new ArrayList<Activity>();public static void addActivity(Activity activity) {activities.add(activity);}public static void removeActivity(Activity activity) {activities.remove(activity);}public static void finishAll() {for (Activity activity : activities) {if (!activity.isFinishing()) {activity.finish();}}}}
自定义的Action
public class MyActions {public static final String MY_BROADCAST_ACTION_UNORDERED = "com.bqt.broadcast.songwennuan_unordered";public static final String MY_BROADCAST_ACTION_ORDERED = "com.bqt.broadcast.songwennuan_ordered";public static final String MY_BROADCAST_ACTION_LOGIN_OTHER = "com.bqt.broadcast.local_login_other";}
一级广播接收者
public class Level1Receiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(MyActions.MY_BROADCAST_ACTION_ORDERED)) {//如果是无序广播,执行setResultData、abortBroadcast会报错!System.out.println("Level1消息:" + getResultData());setResultData("给农民兄弟发5000块钱");//更改接收到的广播内容,发给低优先级的应用abortBroadcast();//阻止广播,但是不能阻止FinalReceiver接收广播,但能更改广播内容之后再发给他。放在setResultData前后都可以。} else if (intent.getAction().equals(MyActions.MY_BROADCAST_ACTION_UNORDERED)) {System.out.println("Level1消息:" + intent.getStringExtra("msg"));}}}
二级广播接收者
public class Level2Receiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(MyActions.MY_BROADCAST_ACTION_ORDERED)) {System.out.println("Level2消息:" + getResultData());setResultData("给农民兄弟发2000块钱");//更改接收到的广播内容,发给低优先级的应用} else if (intent.getAction().equals(MyActions.MY_BROADCAST_ACTION_UNORDERED)) {System.out.println("Level2消息:" + intent.getStringExtra("msg"));}}}
最终广播接收者
public class FinalReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(MyActions.MY_BROADCAST_ACTION_ORDERED)) {System.out.println("Final消息:" + getResultData());} else if (intent.getAction().equals(MyActions.MY_BROADCAST_ACTION_UNORDERED)) {System.out.println("Final消息:" + intent.getStringExtra("msg"));}}}
本地广播
/** 接收到本地广播后弹出对话框,关闭所有Activity,并调到MainActivity */public class MyLocalReceiver extends BroadcastReceiver {@Overridepublic void onReceive(final Context context, Intent intent) {AlertDialog alertDialog = new AlertDialog.Builder(context).setTitle("警告:").setMessage("您的账号在别处登录,请重新登陆~").setCancelable(false).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {ActivityCollector.finishAll();Intent intent = new Intent(context, MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//广播中启动Activity需要设置此flag,因为Activity需要一个栈context.startActivity(intent);}}).create();alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); //系统对话框权限:SYSTEM_ALERT_WINDOWalertDialog.show();}}
清单文件
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.bqt.broadcast"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="17"android:targetSdkVersion="21" /><!-- 系统对话框权限 --><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".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><activity android:name=".SecondActivity" /><!-- —————————————————————自定义广播————————————————————— --><!-- 本地广播 --><receiver android:name=".myreceiver.MyLocalReceiver" ><intent-filter><action android:name="com.bqt.broadcast.local_login_other" /></intent-filter></receiver><!-- 无序广播和有序广播 --><receiver android:name=".myreceiver.Level1Receiver" ><intent-filter android:priority="1000" ><action android:name="com.bqt.broadcast.songwennuan_unordered" /><action android:name="com.bqt.broadcast.songwennuan_ordered" /></intent-filter></receiver><receiver android:name=".myreceiver.Level2Receiver" ><intent-filter android:priority="500" ><action android:name="com.bqt.broadcast.songwennuan_unordered" /><action android:name="com.bqt.broadcast.songwennuan_ordered" /></intent-filter></receiver><receiver android:name=".myreceiver.FinalReceiver" ><intent-filter android:priority="10" ><action android:name="com.bqt.broadcast.songwennuan_unordered" /><action android:name="com.bqt.broadcast.songwennuan_ordered" /></intent-filter></receiver></application></manifest>
广播接收者 BroadcastReceiver 示例-2的更多相关文章
- 广播接收者 BroadcastReceiver 示例-1
广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者.广播作为Android组件间的通信方式,可以使用的场景如下: 1 ...
- Android系统编程入门系列之广播接收者BroadcastReceiver实现进程间通信
在前边几篇关于Android系统两个重要组件的介绍中,界面Activity负责应用程序与用户的交互,服务Service负责应用程序内部线程间的交互或两个应用程序进程之间的数据交互.看上去这两大组件就能 ...
- Android - 广播接收者 - BroadcastReceiver
BroadcastReceiver 介绍: 广播是一种广泛运用的在应用程序之间传输信息的机制 .而 BroadcastReceiver 是对发送出来的广播 进行过滤接收并响应的一类组件 接受一种或者多 ...
- Android中广播接收者BroadcastReceiver详解
1. 接收系统的广播步骤 (1) 新建一个类继承BroadcastReceiver 以监听sd卡状态的广播接收者为例 public class SdCardBroadcastReceiver ext ...
- Android学习笔记_19_广播接收者 BroadcastReceiver及其应用_窃听短信_拦截外拨电话
一.广播接收者类型: 广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”. 普通广播是完全异步的,可以在同一时刻(逻辑上 ...
- 广播接收者BroadcastReceiver
BroadcastReceiver与activity,service有完整的生命周期不同,BroadcastReceiver本质上是一系统级别的监听器,专门负责监听各程序发出的broadcast.与程 ...
- 广播接收者 BroadcastReceiver
1. 分为动态注册和静态注册, 静态注册在清单文件里配置即可.动态创建为代码手动添加. 在锁屏广播中, 使用静态创建消息接受不成功, 原因未知. 动态即可. 代码如下: 2. 创建类, 继承与Broa ...
- 广播发送者&广播接收者介绍
1.广播接收者 广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类,重写: public void onReceive(Context context ...
- Android(java)学习笔记175:BroadcastReceiver之 外拨电话的广播接收者
首先我们示例工程一览表如下: 1.首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中定义了监听到广播,要执行的操作: ...
随机推荐
- BitmapImage使用FileStream读取文件
var bitmapImage = new BitmapImage(); using (FileStream fs = new FileStream(file.FullName, FileMode.O ...
- Knockoutjs官网翻译系列(四) computed中依赖追踪是如何工作的
初学者无需了解这些 ,但是很多高级程序员想知道我们为什么可以保持跟踪这些依赖以及可以正确的更新到UI中.它其实很简单.跟踪算法是这样的: 无论何时你定义了一个computed observable,K ...
- QT5控件-QDateTimeEdit和类QDateTime
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QDateTime> #i ...
- 你好,C++(24)好大一个箱子!5.1.1 函数的声明和定义
第5章 用函数封装程序功能 在完成功能强大的工资程序V1.0之后,我们信心倍增,开始向C++世界的更深远处探索. 现在,我们可以用各种数据类型定义变量来表达问题中所涉及的各种数据:用操作符连接这些变量 ...
- js获取url?后的参数
function GetRequest() { var url = location.search; //获取url中"?"符后的字串 var theRequest = new O ...
- cocos2d-x 工程目录结构说明
下载最新的cocos2d-x,解压完之后呈现出如下的目录结构: cocos2dx:框架核心目录,里面是存放了2dx引擎的核心代码. CocosDenshion:各个平台的音效实现. document: ...
- PHP生成数字+字符混合型字符串
以下是一个用PHP随机生成字符+数字混合型的随机字符串,可用来生成会员ID.用户密码/密钥等内容,函数简单,代码如下: <?php function generate_rand($l){ $c= ...
- 存储过程中update,然后用sql%判断update是否成功的存储过程
--更新用户状态 PROCEDURE P_UPDATE_USER_STATUS ( v_SrcID IN NUMERIC, v_DstID IN NUMERIC, v_DstType IN NUMER ...
- windows 10是如何做到全平台统一的?
1.EXE本身就是个容器,它可以在ARM平台上包含ARM的native code执行,也可以在x86平台上包含x86的native code执行,本质上无差别(所以麻烦那些说EXE不能在ARM平台上运 ...
- 扩展Visual Studio IDE
安装visual studio 2012 SDK 下载visual studio SDK. 安装可能遇到的问题 安装时报错:Visual Studio 2012 Install Fails: Prog ...