广播接收者 BroadcastReceiver 示例-2

BaseActivity


/**所有Activity的基类*/

public class BaseActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        ActivityCollector.addActivity(this);

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        ActivityCollector.removeActivity(this);

    }

}

MainActivity


public class MainActivity extends BaseActivity {

    @Override

    protected 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() {

            @Override

            public void onClick(View v) {

                startActivity(new Intent(MainActivity.this, SecondActivity.class));

            }

        });

        setContentView(textView);

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        Log.i("MainActivity", "++++++onDestroy");

    }

    @Override

    public void finish() {

        super.finish();

        Log.i("MainActivity", "++++++finish");

    }

}

SecondActivity


public class SecondActivity extends BaseActivity {

    private MyLocalReceiver localReceiver;

    //本地广播的管理器,该机制发出的广播只会在APP内部传播,且广播接收者也只能收到本APP发出的广播!本地广播无法通过静态方式注册,相比起系统全局广播更加高效

    private LocalBroadcastManager localBroadcastManager;

    @Override

    protected 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()方法添加多个Action

        localBroadcastManager = LocalBroadcastManager.getInstance(this);

        localBroadcastManager.registerReceiver(localReceiver, intentFilter);//注册广播接收者,设置过滤器

        textView.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                localBroadcastManager.sendBroadcast(new Intent(MyActions.MY_BROADCAST_ACTION_LOGIN_OTHER));

            }

        });

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        localBroadcastManager.unregisterReceiver(localReceiver);

        Log.i("SecondActivity", "++++++onDestroy");

    }

    @Override

    public 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 {

    @Override

    public 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 {

    @Override

    public 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 {

    @Override

    public 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 {

    @Override

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

        AlertDialog alertDialog = new AlertDialog.Builder(context).setTitle("警告:").setMessage("您的账号在别处登录,请重新登陆~").setCancelable(false)

                .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                    @Override

                    public 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_WINDOW

        alertDialog.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-sdk

        android:minSdkVersion="17"

        android:targetSdkVersion="21" />

    <!-- 系统对话框权限 -->

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android: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>

来自为知笔记(Wiz)

时间: 2024-08-07 06:11:04

广播接收者 BroadcastReceiver 示例-2的相关文章

广播接收者 BroadcastReceiver 示例-1

广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者.广播作为Android组件间的通信方式,可以使用的场景如下: 1.同一app内部的同一组件内的消息通信(单个或多个线程之间): 2.同一app内部的不同组件之间的消息通信(单个进程): 3.同一app具有多个进程的不同组件之间的消息通信: 4.不同app之间的组件之间消息通信: 5.Android系统在特定情况下与App之间的消息通信. 从实现原理看上,Andr

Android 广播接收者 BroadcastReceiver

Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间): 2.同一app内部的不同组件之间的消息通信(单个进程): 3.同一app具有多个进程的不同组件之间的消息通信: 4.不同app之间的组件之间消息通信: 5.Android系统在特定情况下与App之间的消息通信. 从实现原理看上,Andro

Android中广播接收者BroadcastReceiver详解

1. 接收系统的广播步骤 (1)  新建一个类继承BroadcastReceiver 以监听sd卡状态的广播接收者为例 1 public class SdCardBroadcastReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 String action = intent.getAction(); 6 if("android

广播发送者&amp;amp;广播接收者介绍

1.广播接收者 广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类,重写: public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据: 广播意图就是通过Context.sendBroadcast(Intent intent)或Context.sendOrderedBroadcast(Intent intent)发送的意图,通过这个语句,能够广播给所有满足条件的组件

【android基础篇】利用广播接收者实现ip拨号和短信窃取的效果

I,广播接收者 广播接收者BroadCastReceiver,怎么理解广播接收者? 系统中,有很多特殊的事件,比如sd卡挂载,外拨电话,接收短信等事件.我们只要注册一个广播接收者,相当于买了个收音机,就可以接收到这些特殊事件. 这些事件,当发生时,总会向外发出广播. II,实现IP拨号 1) 效果:输入一个号码,被当做是ip号码存储起来.等到拨打电话时,加上这个号码,拨打出去. ip号码,可以存储在sharedPreferences中.最关键的是,需要写一个广播接收者,当发生外拨电话这种事件时,

BroadcastReceiver广播接收者(六)——粘性广播(StickyBroadcast)使用示例

MainActivity如下: package cc.com; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.Intent; /** * Demo描述: * 粘性广播(StickyBroadcast)使用示例 * 粘性广播也叫等待广播. * * 使用场景: * 发送一个粘性广播(StickyBroadcast),但是现在并没

BroadcastReceiver广播接收者(四)——本地广播LocalBroadcastManager以及在onReceive()中弹出Dialog

MainActivity如下: package cc.cv; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import an

BroadcastReceiver广播接收者(二)——利用AndroidManifest.xml注册广播接收者

MainActivity如下: package cc.testbroadcasta; import android.os.Bundle; import android.app.Activity; import android.content.Intent; /** * Demo描述: * 利用AndroidManifest.xml注册广播接收者 */ public class MainActivity extends Activity { @Override protected void onC

Android四大组件之广播接收者

介绍如何创建广播.如何发送一个无序广播和有序广播.以及监听短信以及监听呼出电话(当我们发短信和打电话,系统就会发一个广播,我们可以拦截此广播进行监听短信以及监听呼出电话). 定义广播接收者 1.定义类继承BroadcastReceiver,重写onReceive方法 2.当接收到匹配广播之后就会执行onReceive方法 3.清单文件中声明<receiver>,需要在其中配置<intent-filter>指定接收广播的动作和类型 4.BroadcastReceiver除了在清单文件