美文网首页
关于广播

关于广播

作者: 最美下雨天 | 来源:发表于2018-08-24 16:40 被阅读76次

隐式广播(Implict)、显式广播(explicit)

根据官方文档,所有没有直接和你的应用相关的广播都是隐式的,比如ACTION_PACKAGE_REPLACED,会在每个新应用安装时被广播。
因此,像 ACTION_MY_PACKAGE_REPLACED 这样的就是显式广播(explicit Broadcast),因为其只会在你的应用更新时才会进行广播。
绝大多数我们监听的广播都是隐式的。

来源:https://blog.csdn.net/u012810020/article/details/52585287
Android N 删除了三项隐式广播,以帮助优化内存使用和电量消耗。 此项变更很有必要,比如说网络变化的广播(CONNECTIVITY_CHANGE),当网络发生变化时所有注册了隐式监听网络变化的app都会被启动。删除这些广播可以显著提升设备性能和用户体验。同样地,拍照广播和录视频广播(ACTION_NEW_PICTURE or ACTION_NEW_VIDEO)也会出现上述情况。
为缓解这些问题,Android N 采取了以下优化措施:

  • 在Android N平台下即使在Manifest.xml清单文件中注册了 CONNECTIVITY_ACTION广播,在网络发生变化时也不会接收到任何的信息。但是正在前台运行的应用程序如果在主线程中通过Context.registerReceiver()动态注册了CONNECTIVITY_ACTION广播,该应用程序仍然可以接收到该广播。(注:这样开发者就可以根据不同的网络状态加载相应的页面信息了,从而提高用户体验)。

  • 应用程序无法发送或接收 ACTION_NEW_PICTURE(拍照) 或 ACTION_NEW_VIDEO(录像) 广播。此项优化会影响所有应用,而不仅仅是面向 Android N 的应用。

Android 框架提供多个解决方案来缓解对这些隐式广播的需求。比如,为了在特定的网络条件下执行特定的网络操作,Android提供了JobScheduler

关于广播唤醒app的问题

有两个app,A和B,A和B都已经安装启动过,假设B已经被杀死,A怎么利用静态广播来唤醒B呢?
A:
核心代码:

tv_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                Context c = null;
                try {
                    //这个是广播B的包名
                    c = createPackageContext("com.example.huozhenpeng.guangbojieshou", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
                //这个是广播B的广播接收器
                intent.setClassName(c, "com.example.huozhenpeng.guangbojieshou.TestBroadcastReceiver");
                intent.setAction("my.broadcast.test");
                intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
                sendBroadcast(intent);
            }
        });

B:
核心代码

public class TestBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Toast.makeText(context, "action:" + action, Toast.LENGTH_LONG).show();
        Log.i("TestBroadcastReceiver", "action:" + action);
    }
}
<receiver android:name=".TestBroadcastReceiver"
            android:exported="true"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" /> <!-- 手机开屏广播,验证发现只有app进程没有死的时候才会收到 -->
            </intent-filter>

            <intent-filter>
                <action android:name="my.broadcast.test" /> <!-- 自定义广播 -->
            </intent-filter>
        </receiver>
通过service唤醒其他app

核心代码:

Intent serviceIntent = new Intent();
serviceIntent.setPackage("com.example.huozhenpeng.guangbojieshou");
serviceIntent.setAction("action");
startService(serviceIntent);

相关文章

网友评论

      本文标题:关于广播

      本文链接:https://www.haomeiwen.com/subject/cffiiftx.html