关于广播

2018-08-24  本文已影响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 框架提供多个解决方案来缓解对这些隐式广播的需求。比如,为了在特定的网络条件下执行特定的网络操作,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);
上一篇 下一篇

猜你喜欢

热点阅读