隐式广播(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);
网友评论